目錄
一.分組查詢
-- 查詢各個部門平均工資 select e.deptno,avg(e.sal) from emp e group by e.deptno; -- 查詢工資高於800員工各部門的平均工資 -- where 需要在group up前,這是分組前各數據的判斷 select e.deptno,avg(e.sal) -- 查詢的字段除了分組用到的字段其他一律要使用聚合函數作處理(非子查詢情況下) from emp e where e.sal>800 group by e.deptno; -- 查詢工資高於800且部門平均工資大於2000的部門 select e.deptno,avg(e.sal) from emp e where e.sal>800 group by e.deptno having avg(e.sal)>2000;
二.多表查詢的一些概念
- 1.迪卡爾積
- 白話:同時查詢多個表,查詢出的總數據量是每張表數據條數之間的乘積
- 2.連表查詢
- A.傳統連表查詢
-- 傳統的連表查詢 -- 內連表查詢數據 select * from emp e inner join dept d on e.deptno=d.deptno; -- 外聯查詢數據(左右外聯查詢到的數據不一定是一樣的,比如null值) -- 左外聯 select * from emp e left join dept d on e.deptno=d.deptno; -- 右外聯 select * from emp e right join dept d on e.deptno=d.deptno;
B.改進後的連表查詢
-- 改進的連表查詢(此時查詢的數據都是兩個表相關聯的,如果其中一個值關聯爲空是不會顯示的) select * from dept d, emp e where d.deptno=e.deptno;
C.oracle特有的連表查詢
-- oracle的聯表查詢 -- '+'在左相當於右連表查詢,按右邊字段匹配 -- '+'在右相當於左連表查詢,按左邊字段匹配 select * from dept d, emp e where d.deptno=e.deptno(+);
3.自連接,(查詢自身表中字段的一些連接)
1.使用
-- 自連接 -- 打印員工以及員工領到 select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno
2.注意,自連表不能夠出現判斷串值的情況
--查詢員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱 -- 判斷無串值 select e1.ename,e2.ename,d1.dname,d2.dname from emp e1,emp e2,dept d1,dept d2 where e1.mgr = e2.empno and e1.deptno=d1.deptno and e2.deptno = d2.deptno; -- 以下數據就是串值, select e1.ename,e2.ename,d1.dname,d2.dname from emp e1,emp e2,dept d1 where e1.mgr = e2.empno and e1.deptno=d1.deptno -- 串值部分,這兩個判斷是and 最後等同於 e1.deptno = e2.deptno 與我們的目的不合,所以需要在添加一個表 and e2.deptno = d1.deptno;
三.子查詢
- 1.基本的子查詢
-- 查詢出工資和10號部門任意員工一樣的員工信息 select * from emp where sal in -- 此處建議使用in,如果子查詢的結果不是唯一那麼就會報錯,一般只有查詢id纔是唯一 (select sal from emp where deptno = 10)
2.連表子查詢
-- 查詢每個部門最低工資,最低工資員工姓名,該員工部門名稱 -- 先查出部門的最低工資 select deptno,min(sal) from emp group by deptno; -- 使用連表查詢 select t.msal,e.ename,d.dname from (select deptno,min(sal) msal -- 子查詢中可以使用別名,因爲from不管怎麼樣都是先執行 -- 因此定義的別名where也是可以使用 from emp group by deptno) t,emp e,dept d where t.msal=e.sal and t.deptno = d.deptno;
四.分頁查詢
-- 分頁查詢 -- rownum:給所有查詢的數據按照順序提供一個行號(oracle分頁是基於此函數的) -- 問題:rownum行號被打亂 -- 原因:因爲執行順序的問題from>select>order by -- 所以rownum賦值行號後,才進行排序 select rownum, e.* from emp e order by e.sal desc; -- 將查詢出來的結果在作爲一個表格,這樣就沒有了排序問題 -- 查詢無結果:因爲rownum不能夠直接判斷大於0的整數,而使用別名又不行,where優先級大於select -- 解決辦法:在套一層查詢 select rownum ,t.* from (select e.* from emp e order by e.sal desc) t where rownum<11 and rownum>5; -- 解決查詢無結果(最終版) --此時就可以使用別名了,別名在from中,from優先級大於where select * from( select rownum rn ,t.* from (select e.* from emp e order by e.sal desc) t where rownum<11) where rn>5; -- 以後的模板 -- 以後的模板 select * from( select rownum rn ,t.* from ( select e.* from emp e order by e.sal desc-- 此處爲各種數據篩選條件 ) t where rownum<11) where rn>5;