Home [SQL] 外部結合 Left Join
Post
Cancel

[SQL] 外部結合 Left Join

Left Join

left join:「以左顯示」,會返回左邊資料表所有的資料列,以及未滿足結合條件的左則資料(就算左側資料沒有符合條件,也會顯示,簡單說,就是左側資料表的全部資料),而右側資料表如果沒有符合匹配的資料值就會顯示null

比如:on a.id = b.id,則顯示a表中存在的全部數據,以及a、b中都有的數據,a中有,b中沒有的數據以null顯示。

範例一

取得商品別的販賣數量,沒有販賣業續的商品也要輸出

1
2
3
4
5
6
--取得商品別的販賣數量
--沒有販賣業續的商品也要輸出
select A.商品名稱, sum(B.數量) 販賣數量 
from [商品清單] A
left join [販賣資料] B on B.商品ID = A.商品ID
group by A.商品名稱

執行結果

1
2
3
4
5
6
7
8
9
10
11
商品名稱	   販賣數量
15吋液晶螢幕	6
17吋螢幕	   5
19吋螢幕	   3
HUB	          5
印表機	       1
桌上型電腦	    6
掃描器	       1
筆記型電腦	    8
網路卡	       2
數位相機	   NULL

此範例不能使用內部結合inner join(join),不然就會變為「只輸出有販賣業續的商品」了,數位相機 NULL就不會顯示了。

雖然右側資料表「販賣資料」中沒有「數位相機(商品ID = 6)」這筆資料,但左側資料表「商品清單」中有,就會顯示出來,而右則沒有的資料就會以NULL顯示。如下:

1
2
3
4
5
6
7
8
9
10
11
A.商品ID  B.商品ID	商品名稱	販賣數量(B表)
1	    1	   桌上型電腦	 6
2	    2      筆記型電腦	 8
3	    3	   17吋螢幕	    5
4	    4	   19吋螢幕	    3
5	    5	   15吋液晶螢幕	 6
6	    NULL   數位相機	    NULL => left join會顯示左邊資料表所有的資料(即使沒有符合結合條件),右側資料表沒有的資料以null顯示
7	    7	   印表機	    1
8	    8	   掃描器	    1
9	    9	   HUB	       5
10	    10	   網路卡	    2

範例二

取得4月份的商品別販賣數量。沒有販賣業續的商品也要輸出

1
2
3
4
5
6
--取得4月份的商品別販賣數量。沒有販賣業續的商品也要輸出
select A.商品名稱, sum(B.數量) 販賣數量
from [商品清單] A
left join [販賣資料] B on A.商品ID = B.商品ID
and B.[處理日] between '2006-04-01' and '2006-04-30'
group by A.商品名稱

執行結果

1
2
3
4
5
6
7
8
9
10
11
商品名稱	  販賣數量
15吋液晶螢幕    NULL
17吋螢幕	   NULL
19吋螢幕	   3
HUB	          NULL
印表機	       1
桌上型電腦	    5
掃描器	       1
筆記型電腦	    1
網路卡	       NULL
數位相機	   NULL

Inner Join, Left Join, Right Join, Full Join

  • inner join:內部結合,join(inner可以省略),兩張表都有的數據才會顯示,可以理解為「有效連結」(兩表的交集)。
  • left join:可以理解為「以左顯示」,會返回左邊資料表所有的資料列,就算是沒有符合連接條件,而右側資料表如果沒有符合匹配的資料值就會顯示null。比如:on a.id = b.id,則顯示a表中存在的全部數據,以及a、b中都有的數據,a中有,b中沒有的數據以null顯示。

  • right join:可以理解為「以右顯示」,會返回右邊資料表所有的資料列,就算是沒有符合連接條件,而左則資料表如果沒有符合匹配的資料值就會顯示null。比如:on a.id = b.id,則顯示b表中存在的全部數據,以及a、b中都有的數據,b中有,a中沒有的數據以null顯示。

  • full join:可以理解為「全連接」(兩表的聯集),兩張表中所有的數據都顯示。

[SQL筆記] 多表查詢
[SQL] 結合數個資料表 Inner Join (Join)

This post is licensed under CC BY 4.0 by the author.