使用Oracle特有的查询语法, 可以达到事半功倍的效果

1. 树查询
Oracle高级查询create table tree (
Oracle高级查询    id 
number(10not null primary key,
Oracle高级查询    name 
varchar2(100not null,
Oracle高级查询    super 
number(10not null                // 0 is root
Oracle高级查询);
Oracle高级查询
-- 从子到父
Oracle高级查询
select * from tree start with id = ? connect by id = prior super 
Oracle高级查询
-- 从父到子
Oracle高级查询
select * from tree start with id = ? connect by prior id = super
Oracle高级查询
-- 整棵树
Oracle高级查询
select * from tree start with super = 0 connect by prior id = super

2. 分页查询
Oracle高级查询select * from ( 
Oracle高级查询    
select my_table.*, rownum  my_rownum from ( 
Oracle高级查询        
select name, birthday from employee order by birthday
Oracle高级查询    ) my_table 
where rownum < 120 
Oracle高级查询
where my_rownum >= 100;

3. 累加查询, 以scott.emp为例
Oracle高级查询select empno, ename, sal, sum(sal) over(order by empno) result from emp;
Oracle高级查询 
Oracle高级查询     EMPNO ENAME             SAL     RESULT
Oracle高级查询
---------- ---------- ---------- ----------
Oracle高级查询
      7369 SMITH             800        800
Oracle高级查询      
7499 ALLEN            1600       2400
Oracle高级查询      
7521 WARD             1250       3650
Oracle高级查询      
7566 JONES            2975       6625
Oracle高级查询      
7654 MARTIN           1250       7875
Oracle高级查询      
7698 BLAKE            2850      10725
Oracle高级查询      
7782 CLARK            2450      13175
Oracle高级查询      
7788 SCOTT            3000      16175
Oracle高级查询      
7839 KING             5000      21175
Oracle高级查询      
7844 TURNER           1500      22675
Oracle高级查询      
7876 ADAMS            1100      23775
Oracle高级查询      
7900 JAMES             950      24725
Oracle高级查询      
7902 FORD             3000      27725
Oracle高级查询      
7934 MILLER           1300      29025

4. 高级group by
Oracle高级查询select decode(grouping(deptno),1,'all deptno',deptno) deptno,
Oracle高级查询       decode(
grouping(job),1,'all job',job) job,
Oracle高级查询       
sum(sal) sal
Oracle高级查询
from emp 
Oracle高级查询
group by ROLLUP(deptno,job);
Oracle高级查询DEPTNO                                   JOB              SAL
Oracle高级查询
---------------------------------------- --------- ----------
Oracle高级查询
10                                       CLERK           1300
Oracle高级查询
10                                       MANAGER         2450
Oracle高级查询
10                                       PRESIDENT       5000
Oracle高级查询
10                                       all job         8750
Oracle高级查询
20                                       CLERK           1900
Oracle高级查询
20                                       ANALYST         6000
Oracle高级查询
20                                       MANAGER         2975
Oracle高级查询
20                                       all job        10875
Oracle高级查询
30                                       CLERK            950
Oracle高级查询
30                                       MANAGER         2850
Oracle高级查询
30                                       SALESMAN        5600
Oracle高级查询
30                                       all job         9400
Oracle高级查询
all deptno                               all job        29025

5. use hint
当多表连接很慢时,用ORDERED提示试试,也许会快很多
 

相关文章: