1. 程式人生 > 程式設計 >Joins in SQL - Inner, Outer, Left and Right

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。每個提到的連線的解釋如下。

Joins in SQL - Inner,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連線相關的查詢,請在下面註釋。

你可能也喜歡: