inner join 與 left join 之間的區別

2021-03-02 碼農DS

 

 

關於inner join 與 left join 之間的區別,以前以為自己搞懂了,今天從前端取參數的時候發現不是預想中的結果,才知道問題出在inner join 上了。

需求是從資料庫查數據,在前端以柱形圖的形式展現出來,查到的數據按行業分組,顯示每個行業的戶數及戶數佔比,涉及到的欄位有A表的用戶數、總用戶數和B表的行業名稱。本來是不管查不查的到數據,在X軸都應該顯示行業名稱的,結果是X、Y軸都沒有任何數據顯示。問題就是我用錯了聯結方式。

一、sql的left join 、right join 、inner join之間的區別

  left join(左聯接) 返回包括左表中的所有記錄和右表中聯結欄位相等的記錄 
  right join(右聯接) 返回包括右表中的所有記錄和左表中聯結欄位相等的記錄
  inner join(等值連接) 只返回兩個表中聯結欄位相等的行

舉例如下: 
----
表A記錄如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表B記錄如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408

----
1.left join
sql語句如下: 
select * from A
left join B 
on A.aID = B.bID

結果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL

(所影響的行數為 5 行)
結果說明:
left join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的.
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中為: A.aID = B.bID).
B表記錄不足的地方均為NULL.
----
2.right join
sql語句如下: 
select * from A
right join B 
on A.aID = B.bID

結果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
NULL     NULL     8     2006032408

(所影響的行數為 5 行)
結果說明:
仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充.
----
3.inner join
sql語句如下: 
select * from A
innerjoin B 
on A.aID = B.bID

結果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404

結果說明:
很明顯,這裡只顯示出了 A.aID = B.bID的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄.

相關焦點

  • left join,right join,inner join,full join之間的區別
    left join,right join,inner join,full join之間的區別通俗講:left以 left join 左側的表為主表
  • inner join 與 left join 之間的區別,你真的搞懂了嗎?
    join 與 left join 之間的區別,以前以為自己搞懂了,今天從前端取參數的時候發現不是預想中的結果,才知道問題出在inner join 上了。一、sql的left join 、right join 、inner join之間的區別left join(左聯接) :返回包括左表中的所有記錄和右表中聯結欄位相等的記錄right join(右聯接) :返回包括右表中的所有記錄和左表中聯結欄位相等的記錄inner join(等值連接) :只返回兩個表中聯結欄位相等的行舉例如下:
  • SQL語言中,inner join 、left join 、right join和full join的定義和圖示
    left join 是左連接,返回坐表中所有的行以及右表中符合條件的行。right join右連接,是返回右表中所有的行及左表中符合條件的行。full join全連接,是返回左表中所有的行及右表中所有的行,並按條件連接。
  • 【面試必備】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
  • Mysql left join 轉 inner join
    在日常優化過程中,發現一個怪事情,同一個SQL出現兩個完全不一樣執行計劃,left join 連驅動表都可以變成不一樣。
  • left semi join 與 inner join 相同點與區別
    今天無意中發現了left semi join這種連接關鍵字的用法,在這裡分享一下,避免大家以後踩坑。1.
  • SQL表連接查詢(inner join、full join、left join、right join)
    表的數據有: 一、內連接-inner jion:最常見的連接查詢可能是這樣,查出學生的名字和成績:select s.name,m.mark from student s,mark m where s.id=m.studentid上面就是我們最常見的inner join,即內連接,把符合student.id=mark.studentid 條件的元組才選出來,也可以寫成:
  • left semi join和left join區別
    一 使用對比(a表和b表通過user_id關聯)1.1 a表數據
  • left join、right join和join ???
    點擊上方「JAVA」,星標公眾號重磅乾貨,第一時間送達說到SQL,很多人可能用了挺久,但依然有個問題一直困擾著,那就是 leftjoin、 join、 right join和 inner join等等各種 join的區別。
  • 超詳細mysql left join,right join,inner join用法分析
    join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的.  join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充. 3.inner join(相等聯接或內聯接) sql語句如下:  SELECT * FROM  a INNER JOIN  b ON a.aID =b.bID 等同於以下SQL句: SELECT *  FROM a,b WHERE a.aID = b.bID 結果如下: aID
  • left join、right join和join,傻傻分不清?
    我是帥帥的玉米segmentfault.com/a/1190000017369618說到SQL,很多人可能用了挺久,但依然有個問題一直困擾著,那就是 leftjoin、 join、 right join和 inner join等等各種 join的區別。
  • LEFT JOIN的時候應該用ON還是WHERE?
    說的是LEFT JOIN關聯表中ON,WHERE後面跟條件的區別。當時確實有點懵逼~經常做這種left join,inner join連接,卻發現居然只是模糊的認識。回到家後,馬上開啟了「實踐是檢驗真理的唯一標準」模式。三下五除二,建了兩張表嘗試起來。
  • Left Join 後用 on 還是 where,區別大了!
    前天寫SQL時本想通過 A left B join on and 後面的條件來使查出的兩條記錄變成一條,奈何發現還是有兩條。後來發現 join on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 B表的記錄,A表的記錄一定會顯示。
  • MySQL join 學習
    因此 join 有等效別名關鍵字:inner join:join顯示(explicit) inner join 與隱式(implicit) inner join 性能上沒有區別。典型帶有 join 的 SQL 語法分析典型帶有 join 的 SQL 語句如下所示:1 2 3 4 5SELECT <row_list> FROM <left_table> <inner|left|right> JOIN <right_table> ON <join condition&
  • SQL語句中 left join 後用 on 還是 where,區別大了!
    運行sql : select * from student s left join class c on s.classId=c.id order by s.id運行sql : select * from student s left join class c on s.classId=c.id and s.name="張三" order by
  • 面試官:left join 後用 on 和 where 有什麼區別?
    哈嘍,我是狗哥。
  • SQL 語句中 left join 後用 on 還是 where,區別大了!
    點擊上方「芋道源碼」,選擇「設為星標」管她前浪,還是後浪?
  • Join,left join,right join(1)--連接原理(三十九)
    >++-+-++----+--+| 20180101 | 杜子騰 | 軟體學院 | 20180101 | 母豬的產後護理| 78 || 20180101 | 杜子騰 | 軟體學院 | 20180101 | 論薩達姆的戰爭準備 |
  • MySQL中left join的幾個SQL對比
    join的部分還是存在一些誤解。mysql> select t1.id,t1.name from test1 t1 left join test2 t2 on t1.id=t2.id and t1.name='bb'; +----+-+| id | name |+----+-+| 1 | aa || 2 | bb || 3 | cc || 4 |
  • 你知道 Sql 中 left join 的底層原理嗎?
    總第165篇/張俊紅01.前言寫過或者學過 Sql 的人應該都知道 left join,知道 left join 的實現的效果