user表:
id | name
---------
1 | libk
2 | zyfon
3 | daodao
user_action表:
user_id | action
---------------
1 | jump
1 | kick
1 | jump
2 | run
4 | swim
sql:
select id, name, action from user as u
left join user_action a on u.id = a.user_id
result:
id | name | action
--------------------------------
1 | libk | jump ①
1 | libk | kick ②
1 | libk | jump ③
2 | zyfon | run ④
3 | daodao | null ⑤
分析:
注意到user_action中還有一個(gè)user_id=4, action=swim的紀(jì)錄,但是沒有在結(jié)果中出現(xiàn),
而user表中的id=3, name=daodao的用戶在user_action中沒有相應(yīng)的紀(jì)錄,但是卻出現(xiàn)在了結(jié)果集中
因?yàn)楝F(xiàn)在是left join,所有的工作以left為準(zhǔn).
結(jié)果1,2,3,4都是既在左表又在右表的紀(jì)錄,5是只在左表,不在右表的紀(jì)錄
結(jié)論:
我們可以想象left join 是這樣工作的
從左表讀出一條,選出所有與on匹配的右表紀(jì)錄(n條)進(jìn)行連接, 形成n條紀(jì)錄(包括重復(fù)的行,如:結(jié)果1和結(jié)果3),
如果右邊沒有與on條件匹配的表,那連接的字段都是null.
然后繼續(xù)讀下一條。
引申:
我們可以用右表沒有on匹配則顯示null的規(guī)律, 來(lái)找出所有在左表,不在右表的紀(jì)錄, 注意用來(lái)判斷的那列必須聲明為not null的。
如:
sql:
select id, name, action from user as u
left join user_action a on u.id = a.user_id
where a.user_id is NULL
(注意:1.列值為null應(yīng)該用is null 而不能用=NULL
2.這里a.user_id 列必須聲明為 NOT NULL 的)
result:
id | name | action
--------------------------
3 | daodao | NULL
posted on 2007-04-10 14:56
飛翔的心 閱讀(934)
評(píng)論(0) 編輯 收藏 所屬分類:
SQL