Joins in SQL - Inner, Outer, Left and Right
Join是SQL中一個非常基本的概念,有時會讓人感到困惑。當我們需要找到涉及多個表的屬性的查詢時,使用聯接,這些表具有至少一個共同的屬性。因此,Join 的需要本身就非常清楚。存在用於不同目的的不同型別的連線。原文
在SQL中 Joins
假設我們有兩個表,一個名為STUDENT的表,另一個名為TEACHER的表。
第一個表“STUDENT": 學生的參考詳細資訊,第二個表“TEACHER": 學校教師和課程的詳細資訊。
STUDENT
ClassID | Name | House address |
---|---|---|
101 | 拉傑 | xyz |
201 | Varun | byc |
301 | Chittiz | abc |
401 | 赫馬 | def |
TEACHER
Teacher id | Class name | ClassID |
---|---|---|
1 | 首先 | 101 |
2 | 第二 | 201 |
3 | 第三 | 301 |
4 | 第四 | 401 |
在第二個表中,“ClassID"是一個外來鍵,用作第二個表中第一個表的引用。
現在,如果我們想要查詢教師ID為1;的學生的姓名,我們需要找到上述表格的連線,因為它要求我們收集兩個表格的資訊。因此,僅在兩個表都具有至少一個共同屬性(此處為ClassID)的情況下才使用連線,並且我們需要找到涉及兩個表的屬性的查詢的解決方案。
Join的型別
基本上有四種型別的連線,即Inner,Outer,Left and Right Join。每個提到的連線的解釋如下。
1、Inner Join
讓我們考慮以下兩個表,第一個表的名稱是Country(儲存不同國家的id),另一個表的名稱是State(儲存這些國家/地區的各種狀態)。
COUNTRY
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 |
2. Right Join
另一方面, 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(空)。
3. Left Join
另一方面,左連線(或左外連線)顯示兩個表中共有的資料,以及左表(僅排除)中存在的資料。
這基本上意味著整個左表的資料將在應用左連線時顯示。
如果左表中沒有匹配項,則顯示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(空)
4. Full Outer Join
顧名思義,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連線相關的查詢,請在下面註釋。