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小时内删除。
发表评论