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中還有乙個user_id=4, action=swim的紀錄,但是沒有在結果中出現,
而user表中的id=3, name=daodao的使用者在user_action中沒有相應的紀錄,但是卻出現在了結果集中
因為現在是left join,所有的工作以left為準.
結果1,2,3,4都是既在左表又在右表的紀錄,5是只在左表,不在右表的紀錄
結論:我們可以想象left join 是這樣工作的
從左表讀出一條,選出所有與on匹配的右表紀錄(n條)進行連線,形成n條紀錄(包括重複的行,如:結果1和結果3),
如果右邊沒有與on條件匹配的表,那連線的字段都是null.
然後繼續讀下一條。
引申:我們可以用右表沒有on匹配則顯示null的規律, 來找出所有在左表,不在右表的紀錄, 注意用來判斷的那列必須宣告為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應該用is null 而不能用=null
2.這裡a.user_id 列必須宣告為 not null 的)
result:
id | name | action
--------------------------
3 | daodao | null
mysql 如何優化left join
今天遇到乙個left join優化的問題,搞了一下午,中間查了不少資料,對mysql的查詢計畫還有查詢優化有了更進一步的了解,做乙個簡單的記錄 select c.from hotel info original c left join hotel info collection h on c.hot...
MySQL下LeftJoin的效能優化
今天遇到了乙個問題,有乙個select語句執行超慢,在加了index之後依然超慢。資料庫是mysql,表a中有資料4000條,表b中有資料14000條 select語句為select count from a left join b on a.id b.id 語句1 執行時間為30秒 如果將sele...
mysql 中LEFT JOIN基本用法例項
sql 中left join的含義是 如果 tbl user記錄了學生的姓名 name 和學號 id tbl score記錄了學生 有的學生考試以後被開除了,沒有其記錄 的學號 id 和考試成績 score 以及考試科目 subject 要想列印出各個學生姓名及對應的的各科總成績,則可以用sql語句...