mysql 中用 left join 巧妙用法

2021-04-17 19:44:09 字數 1562 閱讀 4434

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語句...