数据库:内联接,外联接,空值和联接
內聯接:???左表的一行和右表的每一行進行比較, 如果左表的一行和右表的一行符合聯接條件,則返回為結果集中的一行 ------?? 等效于where條件
當聯接表時,創建的聯接類型影響出現在結果集內的行。可以創建下列聯接類型:
? ?僅顯示兩個聯接表中的匹配行的聯接。(這是查詢設計器中的默認聯接類型。)例如,可以聯接 titles 表和 publishers 表以創建顯示每個書名的出版商名稱的結果集。在內聯接中,結果集內不包含沒有出版商信息的書名,也不包含沒有書名的出版商。這類聯接所得到的 SQL 可能象下面這樣:
·??????????????? SELECT???? title, pub_name ·??????????????? FROM???????? titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id注意 ? 當創建內聯接時,包含 NULL 的列不與任何值匹配,因此不包括在結果集內。空值不與其它的空值匹配。
???? sql語法:?? select?__ from __ inner join __ on __?
???? linQ語法:???from?__ in?__?? join __ in __ on?__? select __
???? 結果集:???????????????????????????????????????????????????? ?
外聯接 (跟內聯接的區別是,外聯結至少返回左邊或右表中的所有行)
?????? 1.左向外聯接: 返回左表的所有行,如果左表的某行在右表沒有匹配行,則右表返回空,并組合成結果集中的一行,如果有則聯接成結果集中的一行
? ? ? ? ?包括第一個命名表("左"表,出現在 JOIN 子句的最左邊)中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 語句說明 titles 表和 publishers 表之間的左向外聯接包括所有的書名,甚至包括那些沒有出版商信息的書名:
·????????????????????? SELECT titles.title_id, ·????????????????????? ???????titles.title, ·????????????????????? ???????publishers.pub_name ·????????????????????? FROM titles LEFT OUTER JOIN publishers ·????????????????????? ????????????ON titles.pub_id ?????????????= publishers.pub_id?????語法:?? select?__ from __?left outer?join __ on __?
???? 結果集:??????????????????????????????????????????????????????
?????? 2.右向外聯接:返回右表的所有行,如果右表的某行在左表沒有匹配行,則左表返回空,并組合成結果集中的一行,如果有則聯接成結果集中的一行???
? ? ?包括第二個命名表("右"表,出現在 JOIN 子句的最右邊)中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之間的右向外聯接將包括所有的出版商,甚至包括那些在 titles 表中沒有書名的出版商。所得到的 SQL 可能象下面這樣:
·????????????????????? SELECT titles.title_id, ·????????????????????? ???????titles.title, ·????????????????????? ???????publishers.pub_name ·????????????????????? FROM titles RIGHT OUTER JOIN publishers ·????????????????????? ????????????ON titles.pub_id ?????????????= publishers.pub_id
???? 語法:?? select?__ from __?right outer?join __ on __
???? 結果集:?????????????????????????????????????????????????????? ?
?????? 3.完整外部聯接:返回左表和右邊的所有行;若不匹配,則一邊有值,一邊為空
? ? ? 包括所有聯接表中的所有行,不論它們是否匹配。例如,titles 表和 publishers 表之間的完整外部聯接顯示所有書名和所有出版商,甚至包括那些在另一個表中沒有匹配值的書名和出版商。
·????????????????????? SELECT titles.title_id, ·????????????????????? ???????titles.title, ·????????????????????? ???????publishers.pub_name ·????????????????????? FROM titles FULL OUTER JOIN publishers ·????????????????????? ????????????ON titles.pub_id ?????????????= publishers.pub_id
???? 語法:?? select?__ from __?full outer?join __ on __
???? 結果集:?????????????????????????????????????????????????????????
交叉聯接:返回左表中的每一行,左表中的每一行與右表中的所有行組合,結果集的行數等于左表的行數乘右表的行數
? ?在這類聯接的結果集內,兩個表中每兩個可能成對的行占一行。例如,在通過作者 CROSS JOIN 出版商輸出的結果集內,每個可能的作者/出版商組合占一行。所得到的 SQL 可能象下面這樣:
·??????????????? SELECT * FROM authors CROSS JOIN publishers
???? 語法:?? select?__ from __?cross join __ on __
???? 結果集:??????????????????????????????????????????????????????????
自聯接:和自身進行聯接?????語法:?? select?__ from __?inner?join __ on __
多表聯接:
???? 語法:?? select?__ from __?inner join __ on __ inner join __ on __
?
空值和聯接
如果要聯接的表的列中有空值,則這些空值互相不匹配。如果其中一個聯接表的列中出現空值,只能通過外聯接返回這些空值(除非 WHERE 子句不包括空值)。
下面的兩個表中,每個表在要參與聯接的列中均包含 NULL 值:
table1????????????????????????? table2 a?????????? b?????????????????? c??????????? d -------???? ------????????????? -------????? ------ ????? 1??????? one???????????????? NULL???????? two ?? NULL????? three?????????????????? ?4??????? four ????? 4????? join4將列 a中的值與列 c中的值進行比較的聯接在包含 NULL 值的列上不能獲得匹配結果:
SELECT * FROM table1 t1 JOIN table2 t2 ?? ON t1.a = t2.c ORDER BY t1.a只返回列 a和 c值為 4 的一行:
a?????????? b????? c?????????? d????? ----------- ------ ----------- ------ 4???? ??????join4? 4?????????? four?? ? (1 row(s) affected)從基表返回的空值和從外聯接返回的空值也很難區分。例如,下面的 SELECT 語句對這兩個表進行左向外聯接:
SELECT * FROM table1 t1 LEFT OUTER JOIN table2 t2 ?? ON t1.a = t2.c ORDER BY t1.a下面是結果集:
a?????????? b????? c?????????? d????? ----------- ------ ----------- ------ NULL??????? three? NULL??????? NULL 1?????????? one??? NULL??????? NULL 4?????????? join4? 4?????????? four?? ? (3 row(s) affected)結果并不能使數據中的 NULL 值和表示聯接失敗的 NULL 值容易區分。如果要聯接的數據出現空值,最好用常規聯接將這些空值從結果中省略。
?
參考:
http://www.cnblogs.com/cyberhedgehog/articles/1195523.html
http://www.cnblogs.com/zp89850/archive/2007/06/04/770983.html
轉載于:https://www.cnblogs.com/WayneZeng/p/3352405.html
總結
以上是生活随笔為你收集整理的数据库:内联接,外联接,空值和联接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 2515 差分序列,排列组合
- 下一篇: vim 代码注释插件