oracle 複雜的查詢用法
阿新 • • 發佈:2019-01-28
【第一題】: 找到員工表中工資最高的前三名,要求按如下格式輸出(第一步部分);以及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')