1. 程式人生 > >oracle學習之多表查詢,子查詢以及事務處理

oracle學習之多表查詢,子查詢以及事務處理

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學習之多表查詢,子查詢以及事務處理