SQL語言中,inner join 、left join 、right join和full join的定義和圖示

2021-12-11 CoCoSevenFanth

join等價於 inner join 是內連接 ,返回兩個表都有的符合條件的行。

left join 是左連接,返回坐表中所有的行以及右表中符合條件的行。

right join右連接,是返回右表中所有的行及左表中符合條件的行。

full join全連接,是返回左表中所有的行及右表中所有的行,並按條件連接。

sql中的連接查詢有inner join(內連接)、left join(左連接)、right join(右連接)、full join(全連接)四種方式,它們之間其實並沒有太大區別,僅僅是查詢出來的結果有所不同。 

例如我們有兩張表: 

Orders表通過外鍵Id_P和Persons表進行關聯。

1.inner join(內連接),在兩張表進行連接查詢時,只保留兩張表中完全匹配的結果集。我們使用inner join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p INNER JOIN Orders o ON p.Id_P=o.Id_P and 1=1  --用and連接多個條件 ORDER BY p.LastName

查詢結果集: 

此種連接方式Orders表中Id_P欄位在Persons表中找不到匹配的,則不會列出來。

注意:單純的select * from a,b是笛卡爾乘積。比如a表有5條數據,b表有3條數據,那麼最後的結果有5*3=15條數據。

但是如果對兩個表進行關聯:select * from a,b where a.id = b.id 意思就變了,此時就等價於:

select * from a inner join b on a.id = b.id。即就是內連接。

但是這種寫法並不符合規範,可能只對某些資料庫管用,如sqlserver。推薦最好不要這樣寫。最好寫成inner join的寫法。

 

內連接查詢 (select * from a join b on a.id = b.id) 與 關聯查詢 (select * from a , b where a.id = b.id)的區別 

2.left join,在兩張表進行連接查詢時,會返回左表所有的行,即使在右表中沒有匹配的記錄。我們使用left join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p LEFT JOIN Orders o ON p.Id_P=o.Id_P ORDER BY p.LastName

查詢結果如下: 

可以看到,左表(Persons表)中LastName為Bush的行的Id_P欄位在右表(Orders表)中沒有匹配,但查詢結果仍然保留該行。

3.right join,在兩張表進行連接查詢時,會返回右表所有的行,即使在左表中沒有匹配的記錄。我們使用right join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p RIGHT JOIN Orders o ON p.Id_P=o.Id_P ORDER BY p.LastName

查詢結果如下:

Orders表中最後一條記錄Id_P欄位值為65,在左表中沒有記錄與之匹配,但依然保留。

4.full join,在兩張表進行連接查詢時,返回左表和右表中所有沒有匹配的行。我們使用full join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p FULL JOIN Orders o ON p.Id_P=o.Id_P ORDER BY p.LastName

查詢結果如下: 

查詢結果是left join和right join的併集。

這些連接查詢的區別也僅此而已。

相關焦點

  • left join,right join,inner join,full join之間的區別
    left join,right join,inner join,full join之間的區別通俗講:left以 left join 左側的表為主表
  • SQL表連接查詢(inner join、full join、left join、right join)
    :最常見的連接查詢可能是這樣,查出學生的名字和成績:select s.name,m.mark from student s,mark m where s.id=m.studentid上面就是我們最常見的inner join,即內連接,把符合student.id=mark.studentid 條件的元組才選出來,也可以寫成:
  • 【面試必備】SQL中left join、right join、inner join的區別
    joinsql語句如下:select * from Aleft join B on A.aID = B.bID結果如下:aID     aNum     bID     bName1     a20050111    1     20060324012     a20050112    2
  • inner join 與 left join 之間的區別
    關於inner join 與 left join 之間的區別,以前以為自己搞懂了,今天從前端取參數的時候發現不是預想中的結果
  • left join、right join和join ???
    join、 join、 right join和 inner join等等各種 join的區別。接下來就來實際自己動手實驗,徹底搞懂圖中的含義。首先,先來建兩張表,第一張表命名為 kemu,第二張表命名為 score:
  • 超詳細mysql left join,right join,inner join用法分析
    join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的. 2.right join(右聯接) sql語句如下:  SELECT  * FROM a RIGHT JOING b  ON a.aID = b.bID 結果如下: aID        aNum                   bID           bName 1            a20050111
  • left join、right join和join,傻傻分不清?
    join、 join、 right join和 inner join等等各種 join的區別。接下來就來實際自己動手實驗,徹底搞懂圖中的含義。首先,先來建兩張表,第一張表命名為 kemu,第二張表命名為 score:
  • Spark SQL 之 Join 實現
    Spark支持所有類型的Join,包括:inner joinleft outer joinright outer joinfull outer joininner joininner join是一定要找到左右表中滿足join條件的記錄,我們在寫sql語句或者使用DataFrame時,可以不用關心哪個是左表,哪個是右表,在spark sql查詢優化階段,spark會自動將大表設為左表,即streamIter,將小表設為右表,即buildIter。
  • Mysql left join 轉 inner join
    在日常優化過程中,發現一個怪事情,同一個SQL出現兩個完全不一樣執行計劃,left join 連驅動表都可以變成不一樣。
  • 面試必知的 Spark SQL 幾種 Join 實現
    Spark支持所有類型的Join,包括:inner joinleft outer joinright outer joinfull outer joininner joininner join是一定要找到左右表中滿足join條件的記錄,我們在寫sql語句或者使用DataFrame時,可以不用關心哪個是左表,哪個是右表,在spark sql查詢優化階段,spark會自動將大表設為左表,即streamIter,將小表設為右表,即buildIter。
  • MySQL join 學習
    不同的 join 類型的語義join 類型語義cross joinCross 即交叉,代表笛卡爾乘積中符號 ×,其也就是兩表的笛卡爾乘積結果inner join語義上等效為從笛卡爾乘積中選出符合條件的交集記錄left join語義上等效為從笛卡爾乘積中選出符合條件的交集記錄+左表剩餘的所有記錄(把左表記錄作為基礎,依次添加右表欄位,如果符合 ON 記錄,那麼賦值為右表欄位值,否則賦值為 NULL)right
  • left semi join和left join區別
  • SQL join語句總結
    看的過程中有點疑惑,乾脆就用MySQL實踐一下,順帶複習下MySQL嘛。這一實踐下來,還發現了另外的有趣的問題,比如MySQL中並沒有full outer join, 那要怎麼在MySQL中模擬full outer join的問題。這麼一來二去,涉及的內容就更加有意思了,不記下來有點可惜,另外國慶實在是一個放鬆的好時機啊,又想偷懶了,那就寫博客來防止自己偷懶吧!
  • Apache Spark 中支持的七種 Join 類型簡介
    object JoinType { def apply(typ: String): JoinType = typ.toLowerCase(Locale.ROOT).replace("_", "") match { case "inner" => Inner case "outer" | "full" | "fullouter" => FullOuter case
  • Join,left join,right join(1)--連接原理(三十九)
    涉及單表的條件:其實就是搜索條件,比如t1.m<a,或者t2.m<d;設計多表的條件:如t1.m = t2.m,t1.n1>t2.n2等。| 78 || 20180101 | 杜子騰 | 軟體學院 | 20180101 | 論薩達姆的戰爭準備
  • left semi join 與 inner join 相同點與區別
    今天無意中發現了left semi join這種連接關鍵字的用法,在這裡分享一下,避免大家以後踩坑。1.
  • SQL數據分析實戰(三):Join語句介紹
    對分析師來說,理解了行列結構,掌握並能靈活應用join語句,在取數據工作中,能起到事半功倍的效果。在SQL專題文章中,我將SQL分成了三個部分,分別是JOIN、UNION、和其他函數。Join 是兩張表(結果集)根據指定條件合併成一個記錄集,多次疊加使用join可以獲得多個數據集的合併結果。
  • SQL-JOIN全解析
    例如下面這張用爛了的圖,可以幫你快速理解每個join用法的效果:這張圖描述了left join(左連接)、right join(右連接) 、inner join(內連接)、outer join(外連接)相關的7種用法。
  • 你知道 Sql 中 left join 的底層原理嗎?
    除了 left join以外,還有inner join、outer join、right join,這些不同的 join 能達到的什麼樣的效果,大家應該都了解了,如果不了解的可以看看網上的帖子或者隨便一本 Sql 書都有講的。今天我們不講這些 join 能達到什麼效果,我們主要講這些 join 的底層原理是怎麼實現的,也就是具體的效果是怎麼呈現出來的。為什麼要講底層原理呢?
  • mysql 如何優化left join
    and c.hotel_id =h.hotel_id where h.hotel_id is null    這個sql是用來查詢出c表中有h表中無的記錄,所以想到了用left join的特性(返回左邊全部記錄,右表不滿足匹配條件的記錄對應行返回null)來滿足需求,不料這個查詢非常慢。