天天看點

多表查詢

做一個簡單的多表查詢:

 • 查詢emp表和dept表

  Emp表一共有14條記錄

  Dept表一共有4條記錄

SELECT * FROM emp,dept ;如果直接執行此語句,會發現産生了56條記錄

 其中肯定存在大量的重複内容,此内容稱為笛卡爾積(表1的資料量*表2的資料量)

那麼該如何消除掉笛卡爾積呢?

 消除的方法就是找兩張表的關聯字段。

 Emp表中有一個deptno字段

 Dept表中有一個deptno字段

此時标準的多表查詢語句就必須将兩個關聯字段進行聯系

 SELECT * 

FROM emp,dept

WHERE emp.deptno=dept.deptno ;  去除笛卡爾積

有些時候如果表名稱過長,則也可以為表名稱起一個别名,之後使用此别名進行查詢。

要求:

 查詢出雇員的姓名、雇員編号、部門名稱、部門位置、職務。

SELECT e.empno,e.ename,e.job,d.dname,d.loc

FROM emp e,dept d

WHERE e.deptno=d.deptno ;

思考:

 要求查詢出每個雇員的編号、姓名、工資,及每個員工工資對應的等級

 • emp表和salgrade表關聯

 • 關聯字段是emp中的sal和salgrade的losal及hisal

SELECT e.empno,e.ename,e.sal,s.grade

FROM emp e,salgrade s

WHERE e.sal BETWEEN s.losal AND s.hisal ;

進一步思考:

 現在要求根據工資的等級進行以下的顯示;

• 如果工資等級為1則顯示為E等工資

• 如果工資等級為2則顯示為D等工資

• 如果工資等級為3則顯示為C等工資

• 如果工資等級為4則顯示為B等工資

• 如果工資等級為5則顯示為A等工資

要使用decode完成

SELECT e.empno,e.ename,e.sal,

decode(s.grade,1,'E等工資',2,'D等工資',3,'C等工資',4,'B等工資',5,'A等工資') 工資等級

FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal ;

 查詢出每個雇員的姓名、職務及其直接上級的姓名、工資和職務

 Emp表要自己關聯自己吧,是以此種關聯稱為自身連接配接。

 SELECT e.ename,e.job,m.ename 

FROM emp e,emp m

WHERE e.mgr=m.empno ;

觀察以下的代碼:

SELECT e.empno,e.ename,d.deptno,d.dname,d.loc

WHERE e.deptno=d.deptno;

發現部門一共有四個:10、20、30、40,但是以上的查詢中隻出現3個部門

此時就需要進行外連接配接

 • 左外連接配接:

WHERE e.deptno=d.deptno(+);

 • 右外連接配接:

 SELECT e.empno,e.ename,d.deptno,d.dname,d.loc

WHERE e.deptno(+)=d.deptno;

  是以此時40部門出現了

 • (+)在等号的左邊表示右連接配接

 • (+)在等号的右邊表示左連接配接

表連接配接的基本操作完了,但是除了這些之外SQL:1999文法中又定義了另外一套實作效果一樣的文法。(了解)

CROSS JOIN表示傳回笛卡爾積

FROM emp CROSS JOIN dept ;

NATURAL JOIN:根據兩個表的關聯字段自動進行比對

SELECT * 

FROM emp NATURAL JOIN dept ;

USING子句:指定要産生連接配接的列

FROM emp JOIN dept USING(deptno) ;

 限制:要求emp表和dept表中都必須同時存在deptno列,列的名字不能不一緻。

ON子句:指定要進行連接配接比對的列

FROM emp e JOIN dept d ON(e.deptno=d.deptno) ;

右外連接配接:

FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno=d.deptno) ; 

左外連接配接:

FROM emp e LEFT OUTER JOIN dept d ON(e.deptno=d.deptno) ;

本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/91210,如需轉載請自行聯系原作者

上一篇: 限制查詢
下一篇: Oracle函數