mysql left join on 与 where 筛选的差异

来源:互联网 发布:js正则判断是否是数字 编辑:程序博客网 时间:2024/06/15 11:25

mysql left join   on 与 where 筛选的差异

准备两张表:
a表:id       a1       a12       a23       a3b表:id       b1       b12       b2

1.没有条件
SELECT * FROM a
LEFT JOIN b ON a.id = b.id;
------------------------------
id       a    id1    b
1    a1    1    b1
2    a2    2    b2
3    a3

2.WHERE
SELECT * FROM a
LEFT JOIN b ON a.id = b.id
WHERE b.b = 'b1';
------------------------------
id       a    id1    b
1    a1    1    b1    

3.ON(AND)
SELECT * FROM a
LEFT JOIN b ON a.id = b.id
AND b.b = 'b1';
------------------------------
id       a    id1    b
1    a1    1    b1
2    a2    
3    a3

发现left join 语句 on和 where有差异,
和标准查询关键字执行顺序有关;

left join 是在from范围类,所以先on条件筛选表,然后两表再做left join。
而对于where来说在left join结果再次筛选

where等价于:
1>SELECT * FROM a LEFT JOIN b ON a.id = b.id;
2>在查询结果中将b.b = 'b1'筛选出来

on(and)等价于:
1>select * from b where b.b = 'b1'
2>再将查询结果与A表做left join

*********************************************    
* 对于主表的筛选条件应放在where后面
* 对于关联表的筛选条件应放到on后面


对于关联查询,其实可以先做子查询,再join
SELECT * FROM a
LEFT JOIN (SELECT * from b where b.b = 'b1') b ON a.id = b.id
where a.a = 'a1';


2 0