left join on and vs where
场景描述
查询业务数据是,有如下需求。需要从
a
表中去除b
表中包含的数据。我的第一个想法是a left join b on a.id = b.aid and b.aid is null
,然后数据是出来了。但是抽了几个发现,a
中有,b
中也有。于是我陷入了沉思。
复现
造数据
CREATE TABLE `join_1` (
`id` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `join_2` (
`id` int(11) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
`thing` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
查询
select * from join_1 left join join_2 on join_1.id = join_2.id and join_2.phone is not null;
以and
查询结果如下
这里很明显可以看到,我明明不想要手机号为
null
的,但是查询结果里怎么还是有。。我明明加了判空条件了。。
select * from join_1 left join join_2 on join_1.id = join_2.id where join_2.phone is not null;
以where
查询结果如下
这里的查询结果正是我想要的。但是
and
和where
有啥区别呢。
分析
where
语句发生在join
之后,它是对join
结果的过滤
on、and
语句,发生在join
之前,数据在join
的过程中被过滤。
这里我用and
查询存在空值是因为,join
之前join_2
表中的确有数据,后面left join
之后才产生null
数据的。