Joins in SQL - Inner, Outer, Left and Right

Join是SQL中一個很是基本的概念,有時會讓人感到困惑。當咱們須要找到涉及多個表的屬性的查詢時,使用聯接,這些表具備至少一個共同的屬性。所以,Join 的須要自己就很是清楚。存在用於不一樣目的的不一樣類型的鏈接。原文html

在SQL中 Joins

假設咱們有兩個表,一個名爲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

Join的類型

基本上有四種類型的鏈接,即Inner, Outer, Left and Right Join。每一個提到的鏈接的解釋以下。對象

Joins in SQL - Inner, Outer, Left and Right Join

一、Inner 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

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鏈接相關的查詢,請在下面註釋。

你可能也喜歡:

相關文章
相關標籤/搜索