Join是SQL中一個很是基本的概念,有時會讓人感到困惑。當咱們須要找到涉及多個表的屬性的查詢時,使用聯接,這些表具備至少一個共同的屬性。所以,Join 的須要自己就很是清楚。存在用於不一樣目的的不一樣類型的鏈接。原文html
假設咱們有兩個表,一個名爲STUDENT的表,另外一個名爲TEACHER的表。sql
第一個表「STUDENT": 學生的參考詳細信息,第二個表「TEACHER": 學校教師和課程的詳細信息。ide
STUDENTui
ClassID | Name | House address |
---|---|---|
101 | 拉傑 | xyz |
201 | Varun | byc |
301 | Chittiz | abc |
401 | 赫馬 | def |
TEACHERcode
Teacher id | Class name | ClassID |
---|---|---|
1 | 首先 | 101 |
2 | 第二 | 201 |
3 | 第三 | 301 |
4 | 第四 | 401 |
在第二個表中,「ClassID"是一個外鍵,用做第二個表中第一個表的引用。cdn
如今,若是咱們想要查找教師ID爲1;的學生的姓名,咱們須要找到上述表格的鏈接,由於它要求咱們收集兩個表格的信息。所以,僅在兩個表都具備至少一個共同屬性(此處爲ClassID)的狀況下才使用鏈接,而且咱們須要找到涉及兩個表的屬性的查詢的解決方案。htm
基本上有四種類型的鏈接,即Inner, Outer, Left and Right Join。每一個提到的鏈接的解釋以下。對象
讓咱們考慮如下兩個表,第一個表的名稱是Country(保存不一樣國家的id),另外一個表的名稱是State(保存這些國家/地區的各類狀態)。blog
COUNTRYthree
CountryId | CountryName |
---|---|
1 | 中國 |
2 | 印度 |
3 | 美國 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德滿都 |
04 | 6 | 伊斯蘭堡 |
select * from COUNTRY
inner join STATE
on COUNTRY.CountryId=STATE.CountryId
上面提到的命令在兩個表上應用內鏈接,由於common屬性是Country id,咱們已經在同一個上應用了鏈接。
內鏈接返回兩個表中的全部匹配值。這裏,在表State中,由於country table中惟一匹配的CountryId值是{CountryId = 2},做爲內鏈接的結果,咱們將獲得如下結果:
CountryId | CountryName | StateId | StateName |
---|---|---|---|
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
另外一方面, right (or right outer join) 顯示兩個表中共有的數據,以及右表(僅排除)中存在的數據。
這基本上意味着整個右表的數據將在應用右鏈接時顯示。
若是左表中沒有匹配項,則顯示NULL。
Example:
COUNTRY
CountryId | CountryName |
---|---|
1 | 中國 |
2 | 印度 |
3 | 美國 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德滿都 |
04 | 6 | 伊斯蘭堡 |
select * from COUNTRY
right join STATE
on COUNTRY.CountryId=STATE.CountryId
上面提到的命令在兩個表上應用了右鏈接,由於公共屬性是CountryId;,咱們已經在CountryId自己上應用了鏈接。
右表是咱們引用的第二個表。
因爲應用了正確的鏈接,咱們會獲得下表:
CountryId | CountryName | StateId | StateName |
---|---|---|---|
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
5 | NULL | 03 | 加德滿都 |
6 | NULL | 04 | 伊斯蘭堡 |
在結果中,清楚地描述了左表中的值在右對象中絕對沒有匹配值的值未被顯示。僅顯示左表的那些與右對象具備共同屬性的值。而右表中的全部值都會顯示。右表中沒有匹配的行顯示爲NULL(空)。
另外一方面,左鏈接(或左外鏈接)顯示兩個表中共有的數據,以及左表(僅排除)中存在的數據。
這基本上意味着整個左表的數據將在應用左鏈接時顯示。
若是左表中沒有匹配項,則顯示NULL。
COUNTRY
CountryId | CountryName |
---|---|
1 | 中國 |
2 | 印度 |
3 | 美國 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德滿都 |
04 | 6 | 伊斯蘭堡 |
select * from COUNTRY
left join STATE
on COUNTRY.CountryId =STATE.CountryId
上面提到的命令在兩個表上應用了Left Join,由於common屬性是CountryId;,咱們已經在Countryid自己上應用了鏈接。
左表是咱們引用的第一個表。
關於左鏈接的應用咱們會獲得下表:
CountryId | CountryName | Stateid | Statename |
---|---|---|---|
1 | 中國 | NULL | NULL |
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
3 | 美國 | NULL | NULL |
在結果中,清楚地代表右側列中沒有顯示左側匹配值的值未顯示。僅顯示右列的那些屬性與左側屬性具備共同屬性。而左表中的全部值都顯示出來。右表中沒有匹配的左表中的行顯示爲NULL(空)
顧名思義,Full Outer Join顯示了兩個表的全部內容。 Full Outer Join返回兩個表中的全部匹配記錄,不管其餘表是否匹配。
COUNTRY
CountryId | CountryName |
---|---|
1 | 中國 |
2 | 印度 |
3 | 美國 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德滿都 |
04 | 6 | 加拿大 |
select * from COUNTRY
full outer join STATE
on COUNTRY.CountryId=TEACHER.CountryId
上面提到的命令在兩個表上應用了Full Outer Join,由於common屬性是CountryId;,咱們已經在Countryid自己上應用了鏈接。
關於Full Outer Join的應用,咱們會獲得下表:
CountryId | CountryName | Stateid | Statename |
---|---|---|---|
1 | 中國 | NULL | NULL |
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
3 | 美國 | NULL | NULL |
NULL | NULL | 03 | 加德滿都 |
NULL | NULL | 04 | 伊斯蘭堡 |
此Join將致使全部行。 當沒有匹配時,咱們獲得NULL(空)。
鏈接對於使用SQL中的表很是重要,上面描述的內容真正詳細說明了每一個表的用法。
若是您有任何與SQL鏈接相關的查詢,請在下面註釋。