left join 原理分析
案例分析
user表:
---------
1 | libk
2 | zyfon
3 | daodao
user_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是只在左表,不在右表的纪录
sql例子:
select employee.*, department.name as deptname
from
employee
left join department on employee.department =
department.code
where employee.isuse = ‘1‘
and employee.code
= ‘3700000000‘
结论:
我们可以想象left join
是这样工作的
从左表读出一条,选出所有与on匹配的右表纪录(n条)进行连接,
形成n条纪录(包括重复的行,如:结果1和结果3),
如果右边没有与on条件匹配的表,那连接的字段都是null.
然后继续读下一条。
LEFT JOIN 等价于LEFT OUTER JOIN 是一个表满足条件的行,和另一个表的所有行。