一、什么是連接
連接是在多個表之間通過一定的連接條件,使表之間發(fā)生關(guān)聯(lián)登淘,進而能從多個表之間獲得數(shù)據(jù)。
語法:
SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;
- 在WHERE子句中書寫連接條件吊趾。
- 如果在多個表中出現(xiàn)相同的列名宛裕,則需要使用表名作為來自該表的列名的前綴。
- N個表相連時论泛,至少需要N-1個連接條件
二、連接的類型
- 按照連接條件分:
等值連接
非等值連接
- 按其他連接方法分:
外部連接
內(nèi)部連接
三蛹屿、多表連接寫法
多表連接包含多種寫法屁奏,在這里主要介紹:
- Oracle寫法:oracle公司提供的寫法,絕大多數(shù)符合SQL標準错负,其他關(guān)系型數(shù)據(jù)也適用坟瓢。
- ANNSI 99寫法:ANSI標準提供的寫法,所有關(guān)系型數(shù)據(jù)必須支持犹撒。
四折联、笛卡爾積
- 笛卡爾積是:
第一個表中的所有行和第二個表中的所有行都發(fā)生連接- 笛卡爾積在下列情況卡產(chǎn)生
1.連接條件被省略
2.連接條件是無效的- 為了避免笛卡爾積的產(chǎn)生,通常需要在WHERE子句中包含一個有效的連接條件识颊。
- 笛卡爾積結(jié)果
簡單描述:
表1中有14行數(shù)據(jù)诚镰,表2中有4行數(shù)據(jù),笛卡爾積結(jié)果為56行數(shù)據(jù)
五祥款、使用AND 運算符增加其他的查詢條件
- 在WHERE子句的連接條件后添加AND條件
六清笨、限制歧義列名
- 在用到多個表時可以使用表名作為前綴來限定列。
- 通過使用表前綴可以提高性能刃跛。
- 通過使用列的別名可以區(qū)分來自不同表但是名字相同的列抠艾。
七、使用表的別名
- 通過使用表的別名來簡化查詢語句
2019-02-14_163746.png
八桨昙、多余兩個表的連接
- 多個表連接和兩個表的連接一樣检号,在構(gòu)造SQL語句時,需要多考慮一個表之間的關(guān)聯(lián)條件蛙酪。
九齐苛、多表連接的寫法
- 分析要查詢的列都來自哪個表,構(gòu)成FROM子句
- 分析這些表之間的關(guān)聯(lián)關(guān)系滤否,如果表之間沒有直接的關(guān)聯(lián)關(guān)系脸狸,而是通過另一個中間表關(guān)聯(lián),則也要在FROM子句中補充中間關(guān)聯(lián)表藐俺。
- 接下來在WHERE子句中補充表之間的關(guān)聯(lián)關(guān)系炊甲,通常N個表,至少要有N-1個關(guān)聯(lián)關(guān)系欲芹。
- 分析是否還有其他限制條件卿啡,補充到WHERE子句的表關(guān)聯(lián)關(guān)系之后,作為限定條件菱父。
- 根據(jù)用戶想要顯示的信息颈娜,補充SELECT子句剑逃。
- 分析是否有排序要求,如果排序要求中還涉及到其他表官辽,則也要進行第2步補充排序字段所需要的表蛹磺,并且添加表之間的關(guān)聯(lián)關(guān)系。
十同仆、外部連接
- 在多表連接時萤捆,可以使用外部連接來查看哪些行,按照連接條件沒有被匹配上俗批。
- 外部連接的符號是(+)俗或,語法包括:
左外連接:
SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column(+) = table2.column;
右外連接:
SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column = table2.column(+);
- 外部連接就好像是為符號(+)所在邊的表增加一個“萬能”的行,這個行全部由NULL組成岁忘。他可以和另一邊的表中所有不滿足連接條件的進行連接辛慰。由于這個“萬能”行的各列全是空值,因此在連接結(jié)果中干像,來自“萬能”行屬性值全部為空值帅腌。
十一、自身連接
- 自身連接蝠筑,也叫自連接狞膘,是一個表通過某種條件和本身進行連接的一種方式,就如同多個表連接一樣什乙。
- 例如:
SELECT worker.ename || ' leader is ' || manager.ename FROM emp worker, emp manager WHERE worker.mgr = manager.empno;
十二挽封、SQL:1999語法的連接
- ANSI SQL:1999標準的連接語法
oracle除了上述自己的連接語法外,同時支持美國國家標準協(xié)會(ANSI)的SQL:1999標準的連接語法臣镣。
SELECT table1.column, table2.column FROM table1 [CROSS JOIN table2] | [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON(table1.column_name = table2.column_name)] | [LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)];
- 交叉連接
交叉連接會產(chǎn)生兩個表的交叉乘積辅愿,和兩個表之間的笛卡爾積是一樣的。
使用CROSS JOIN 子句完成忆某。
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc FROM emp CROSS JOIN dept;
- 自然連接
自然連接是對兩個表之間相同名字和數(shù)據(jù)類型的列進行等值的連接点待。
如果兩個表之間相同名稱的列的數(shù)據(jù)類型不同,則會產(chǎn)生錯誤弃舒。
使用NATURAL JOIN子句完成癞埠。
SELECT empno,ename,sal,deptno,loc FROM emp NATURAL JOIN dept;
- USING子句
自然連接是使用所有名稱和數(shù)據(jù)類型相匹配的列作為連接條件,而USING子句可以指定用某個或者某幾個相同名稱和數(shù)據(jù)類型的列作為連接條件聋呢。
SELECT e.ename,e.ename,e.sal,deptno,d.loc FROM emp e JOIN dept d USING (deptno) WHERE deptno = 20;
使用USING子句創(chuàng)建連接時苗踪,應(yīng)注意以下幾點:
- 如果有若干個列名稱相同但數(shù)據(jù)類型不同,自然連接子句可以使用USING子句來替換削锰,以指定產(chǎn)生等值連接的列通铲。
- 如果有多于一個列都匹配的情況,使用USING子句只能指定其中的一列器贩。
- USING子句中用到的列不能使用表名和別名作為前綴颅夺。
- NATURAL JOIN子句和USING子句是相互排斥的朋截,不能同時使用。
- ON子句
自然連接條件基本上是具有相同列名的表之間的等值連接吧黄。
如果要指明任意連接條件部服,或要指明要連接的列,則可以使用ON子句稚字。
用ON將連接條件和其他檢索條件分隔開饲宿,其他檢索條件寫在WHERE子句。
ON子句可以提高代碼的可讀性胆描。
SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc FROM emp e JOIN dept d ON (e.deptno = d.deptno);
- 外連接
左外連接
左外連接以FROM子句中左邊表為基表,該表所有行數(shù)據(jù)按照連接條件無論是否與右邊表能匹配上仗阅,都會被顯示出來SELECT e.ename,e.deptno,d.loc FROM emp e LEFT OUTER JOIN dept d ON (e.deptno = d.deptno);
右外連接
右外連接以FROM子句中右邊表為基表昌讲,該表所有行數(shù)據(jù)按照連接條件無論是否與左邊表能匹配上,都會被顯示出來SELECT e.ename,e.deptno,d.loc FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno = d.deptno);
全外連接
全外連接返回兩個表等值連接結(jié)果减噪,以及兩個表中所有等值連接失敗的結(jié)果SELECT e.ename,e.deptno,d.loc FROM emp e FULL OUTER JOIN dept d ON (e.deptno = d.deptno);