oracle學習之多表查詢,子查詢以及事務處理
阿新 • • 發佈:2017-11-11
color 1-1 註意事項 員工 列數 .com 外連接 分析 top-n分析
多表查詢的基礎是采用笛卡爾集:
最終的行數 = 表1的行數 * 表2的行數
最終的列數 = 表1的列數 + 表2的列數
過濾笛卡爾集的關鍵是寫連接條件,N張表至少需要N-1個條件。
多表查詢例子1,等值與不等值連接,查詢員工信息,員工號,姓名,月薪 和部門名稱
註意,有歧義的字段必須指定是哪個表,否則將會報錯。
當等值連接不成立的時候,想要保留一邊的數據,這時需要使用外連接技術!
左外連接的寫法,即想保留等號左邊的數據,那麽在等號右側添加(+)
自連接,比如查詢員工信息,顯示為:xxx‘s boss is yyy
解題思路:emp看成2張表,一張員工表,一張老板表
連接條件:員工表的老板(mgr)是老板表的員工(empno)
select e.name||‘‘‘s boss is ‘||nvl(b.ename,‘his wife!‘) from emp e,emp b where e.mgr = b.empno(+)
(+)原因在於缺少老板,而使用nvl函數,則是已經是最大的官了
自連接的弊端:即笛卡爾集是平方的增長,大表的時候效率比較低
自連接的使用場景:數據都在同一表;數據不在同一行
子查詢,註意事項:
1,合理的書寫風格,尤其是較復雜的子查詢,要合理的換行和縮進
2,適當的使用()
3,主查詢和子查詢可以是不同表,只要子查詢返回的結果,主查詢可以用即可。
//查詢部門名稱是“SALES”的員工信息 select * from emp where deptno = (select deptno from dept where dname=‘SALES‘);
4,可以在主查詢為where ,select,having,from後放置子查詢
//查詢10號部門員工號,員工姓名,部門編號,部門名稱 select e.empno,e.ename,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno and e.deptno = 10; //子查詢方法: select empno,ename,deptno,(select dname from dept where deptno=10) from emp where deptno =10;
5,不可以在group by,order by後放置子查詢,SQL語法規範
//having後 查詢高於30號部門最低薪水的部門及其最低薪水 select deptno,min(sal) from emp group by deptno having min(sal)>(select min(sal) from emp where deptno =30);
6,在from後面放置的子查詢(***),要理解為放置的是一個集合
查詢員工的性名,薪水和年薪 使用子查詢select * from ___________________完成: 即:select * from (select ename,sal,sal*20 from emp);
7,單行子查詢只能使用單行操作符 = !=;多行子查詢則是使用多行操作符
//查詢部門名稱為SALES和ACCOUNTING的員工信息 //1,先找到這兩的部門編號 select deptno from dept where dname in(‘SALES‘ ,‘ACCOUNTING‘); //2,變成子查詢,IN,取裏面的信息 select * from emp where deptno in(select deptno from dept where dname in(‘SALES‘ ,‘ACCOUNTING‘));
//多行操作符ANY,取任意一個
select * from emp where sal > ANY (select sal from emp where deptno=30);
//多行操作符ALL,取所有
select * from emp where sal > ALL (select sal from emp where deptno=30);
8,要註意子查詢中的NULL值
select * from emp where empno not in ( select distinct mgr from emp where mgr is not null);
9,一般先執行子查詢(內查詢),然後在執行主查詢(外查詢)
10,一般不在子查詢中使用 order by,但在TOP-N分析問題時,必須使用order by
oracle學習之多表查詢,子查詢以及事務處理