做一個簡單的多表查詢:
• 查詢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,如需轉載請自行聯系原作者