mysql中⽤leftjoin巧妙⽤法
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 的 )
sql left join 多表连接result:
id  |    name    |    action
--------------------------
3    |    daodao  |    NULL

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。