一、多表連接
N個表查詢中要連接起來,要寫N-1個連接條件。
1.等值連接
找到表與表之間有關係的列名進行連接 用等號“=”
如有員工表emp,部門表dept,查找員工編號,姓名,部門編號,部門地點
SQL> SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
FROM emp, dept
WHERE emp.deptno=dept.deptno and emp.deptno='10';
使用and查詢能增加其他查詢條件,且有前綴名的能提高查找效率。
where 子句是從右到左執行,所以等值連接語句寫在左邊,其他條件寫在靠右邊能提高where語句執行效率
2.非等值連接
一個表是按照某一列分等級的,另一個要被查詢的表找到相關的所在列進行非等值連接,
一般where子句中用between 左區間 and 右區間 或者in(左區間,右區間)寫判斷條件。
如員工表emp中工資sal ,另一個工資等級表salgrade表
salgrade表有grade(等級),losal(左區間),hisal(右區間)
SQL> SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal
BETWEEN s.losal AND s.hisal;
3.外部連接
外部連接就好象是爲符號(+)所在邊的表增加 一個“萬能”的行,這個行全部由空值組成。它可以和另一邊的表中所有不滿足連接條件的 行進行連接。由於這個“萬能”行的各列全部是空值,因此在連接結果中,來自“萬能”屬性值全部爲空值。
查詢員工的姓名,部門編號,部門名稱,沒有員工的部門也顯示
SQL> SELECT e.ename, d.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno //誰前面有“沒有“該表匹配時才加(+),與另外的表匹配。
ORDER BY e.deptno;
4.自身連接,也叫自連接,是一個表通過某種條件和本身進行連接的一種方式,就如同多個表連接一樣。
查詢員工的上級領導
SQL> SELECT worker.ename||' leader is '||manager.ename
FROM emp worker, emp manager
WHERE worker.mgr = manager.empno;
二、ANSI SQL:1999標準的連接語法 -----------Sql 99標準
– Oracle除了上述自己的連接語法外,同時支持美國國家標準協會(ANSI)的SQL:1999標準的連接語法。
1.cross join 交叉連接 產生笛卡爾積
2.natural join 自然連接 -自然連接是對兩個表之間相同名字和數據類型的列進行的等值連接;
如果兩個表之間相同名稱的列的數 據類型不同,則會產生錯誤;
3.using子句 - 是使用所有名稱和數據類型相匹配的列作爲連接條件,而USING子句可以指定用某個或某幾個相同名字和數據類型的列作爲連接條件。
SELECT e.ename,e.ename,e.sal,deptno,d.loc
FROM emp e JOIN dept d USING (deptno) ----相當於oracle語法中在where子句中的where e.deptno=d.deptno 等 值連接
WHERE deptno = 20 ;
4.on子句
SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc
FROM emp e JOIN dept d ON (e.deptno = d.deptno);
5. 左外連接以FROM子句中的左邊表爲基表,該表所有行數據按照連接條件無論是否與右邊表能匹配上,都會被顯示出來
SELECT e.ename,e.deptno,d.loc
FROM emp e
LEFT OUTER JOIN dept d
ON (e.deptno = d.deptno); -------相當於oracle中的外連接 where e.deptno= d.deptno (+)
6.右外連接以FROM子句中的右邊表爲基表,該表所有行數據按照連接條件無論是否與左邊表能匹配上,都會被顯示出來。
SELECT e.ename,e.deptno,d.loc
FROM emp e
RIGHT OUTER JOIN dept d
ON (e.deptno = d.deptno); -------相當於oracle中的外連接 where e.deptno (+)= d.deptno
7.全外連接返回兩個表等值連接結果,以及兩個表中所有等值連接失敗的記錄
SELECT e.ename,e.deptno,d.loc
FROM emp e
FULL OUTER JOIN dept d
ON (e.deptno = d.deptno);