left
join
中关于
where
和
on
条件的几个知识点:
1.多表
left
join
是会生成一张临时表,并返回给用户
2.
where
条件是针对最后生成的这张临时表进行过滤,过滤掉不符合
where
条件的记录,是真正的不符合就过滤掉。
3.
on
条件是对
left
join
的右表进行条件过滤,但依然返回左表的所有行,右表中没有的补为
NULL
4.
on
条件中如果有对左表的限制条件,无论条件真假,依然返回左表的所有行,但是会影响右表的匹配值。也就是说
on
中左表的限制条件只影响右表的匹配内容,不影响返回行数。(下面测试04)
# 主表:A、关联表:B、关联条件:A.od=B.a_id、筛选条件:B.id=1
A left join B on A.id=B.a_id and B.id=1
1.表 A 和表 B 的连接依靠关联条件
2.主表的筛选条件,应该放置在 where 条件后
3.on 后面的筛选条件是针对于关联表
4.关联表的筛选条件,如果放置在 on 后面,那么 A 和 B 的连接顺序为:B 表先按条件查询,再与 A 表连接,即先筛选再连接;如果放置在 where 后面,那么 A 和 B 的连接顺序为:A 与 B 连接后,再从连接表中筛选,即先连接再筛选
5.where 后面的条件是对连接后的数据进行筛选
6.如果存在多个left join on,请注意on后面的条件与哪个表关联。这一条统计的SQL很重要!例如表A,B,C,A left join B on A.x = B.x left join C on A.x = C.x,B和C的都要和A建立关联,B和C之间是没有任何数据上的关系。但是 如果把A.x = C.x改成B.x = C.x,那么B和C的表数据先建立关联并过滤数据,再与A表数据进行关联,这样可能会出现数据丢失!
测试:
创建两张表:
CREATE TABLE t1(id INT,name VARCHAR(20));
insert into `t1`(`id`,`name`) values (1,'a11');
insert into `t1`(`id`,`name`) values (2,'a22');
insert into `t1`(`id`,`name`) values (3,'a33');
insert into `t1`(`id`,`name`) values (4,'a44');
CREATE TABLE t2(id INT,local VARCHAR(20));
insert into `t2`(`id`,