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:可以理解為「全連接」(兩表的聯集),兩張表中所有的數據都顯示。