1. 程式人生 > >oracle 複雜的查詢用法

oracle 複雜的查詢用法

【第一題】: 找到員工表中工資最高的前三名,要求按如下格式輸出(第一步部分);以及oracle查詢結果指定分頁顯示的方法(第二部分)。

    ——涉及Top-N分析問題。
    一般不在子查詢中使用order by, 但在Top-N分析問題中,必須使用order by

    想將現有的表進行分頁。1-4第一頁,5-8第二頁……

參考內容:

行號rownum(偽列)需要注意的問題:
1. rownum永遠按照預設的順序生成。
SQL> select rownum, empno, ename, sal from emp order by sal desc
——發現行號是跟著行走的。查詢結果順序變了,行號依然固定在原來的行上。行號始終使用預設順序。

2.rownum只能使用<, <=符號,不能使用>,>=符號。

原因:與行號生成的機制有關:Oracle中的行號永遠從1開始——取了1才能取2,取了2才能取3,<=8可以是因為1234567挨著取到,而>=5不行,因為沒有1234,不能直接取5。

第一部分:輸出圖片的效果;
SQL> select rownum, empno, ename, sal 
    from (select * 
        from emp 
        order by sal desc) 
    where rownum <=3

第二部分,對查詢的內容進行分頁顯示:
1-4為一頁; select rownum, empno, ename, sal from (select * from emp order by sal desc) where rownum<=4 and rownum>=1 / 5-8為一頁 select * from (select rownum r, empno, ename, sal from (select * from emp order by sal desc) where rownum<=8) where r >= 5 關鍵是>=5 的獲取問題,是不能直接寫rownum>=
5的。但是這條SQL語句查詢的結果是一個新的“集合”, 該集合中有一列是專門表示行號,可以假想這列不再是偽列,而是該集合中專門用來表示行號的列。 所以,可以給該列取一個別名r,並把該查詢語句整體作為子查詢,放到另外一條SQL語句的from後。

【第二題】找到員工表中薪水大於本部門平均薪水的員工

採用兩種方法:

第一種:一般子查詢,使用自連線(多表查詢的一種特殊情況)

    與第一題一樣,別名的特殊用法;可以從子查詢中帶出來,當作一個元素來使用。

    一般子查詢的的執行順序:先執行子查詢(內查詢),再執行主查詢(外查詢),相關子查詢除外

第二種:使用相關子查詢()

    概念:將主查詢的某個值,當作引數傳遞給子查詢。

 1 一.一般子查詢
 2 1  select empno, e.deptno, ename, sal , d.davg
 3  2  from emp e, (select deptno, avg(sal) davg
 4  3             from emp
 5  4             group by deptno) d
 6  5 where e.deptno = d.deptno and e.sal > d.davg
 7 
 8 
 9 二.相關子查詢
10   select empno, e.deptno, ename, sal , (select avg(sal) from emp where deptno = e.deptno group by deptno) as "avg"
11   from emp e
12   where sal>(select avg(sal) from emp
13           where deptno = e.deptno)

【第三題】統計每年入職的員工個數:以下圖的格式展現:已知員工的入職年份是---1980,1981, 1982,1987;

提示:該練習只考察函式的應用,注意呼叫關係。

——decode():第一個引數:待判斷的值,條件,結果,條件,結果……最後是else的情況。

 1 以圖中的格式輸出
 2 select count(*) Total,
 3 sum(decode(to_char(hiredate, 'yyyy'), '1981', 1, 0)) "1981",
 4             sum(decode(to_char(hiredate, 'yyyy'), '1980', 1, 0)) "1980",
 5             sum(decode(to_char(hiredate, 'yyyy'), '1982', 1, 0)) "1982",
 6             sum(decode(to_char(hiredate, 'yyyy'), '1987', 1, 0)) "1987"
 7         from emp;
 8 
 9 
10 
11 
12  如忽略輸出格式:(即不是圖中的輸出格式:)
13  
14  select to_char(hiredate ,'yyyy')  as "年份", count(*) as "人數"
15      from emp
16      group by to_char(hiredate ,'yyyy')