表A:
表B:
1、 单个条件
select * from product a
left join product_details b
on a.id = b.id
以左表为准匹配,结果:
2、条件写在on 与where区别
(1) 、ON
SELECT * FROM a LEFT JOIN b
ON (a.id = b.id)
AND a.amount = 200;
把on的所有条件作为匹配条件,不符合的右表都为null。
(1) 、WHERE
SELECT * FROM a LEFT JOIN b
ON (a.id = b.id)
WHERE a.amount = 200;
WHERE,匹配完再筛选,结果只有一条记录。
3、where XXX is null 情况
where XXX is null :删除掉不匹配on后面条件的记录。
where XXX is not null :筛选出符合on后面条件的记录。
常用于只需要左表的数据,比如count id这类。
where XXX is not null:
SELECT a.* FROM a LEFT JOIN b
ON a.id=b.id AND b.money!=100 AND b.number=2
WHERE b.id IS NOT NULL;
where XXX is null:
SELECT a.* FROM a LEFT JOIN b
ON a.id=b.id AND b.money!=100 AND b.number=2
WHERE b.id IS NULL;
可以直观看出,只有id=4的记录完全匹配上三个条件,所以筛除这条纪录,另三条保留,此时这三条纪录的右表均为null。
筛选出不符合on后面条件的,即
!(a.id=b.id AND b.money!=100 AND b.number=2).
!(a.id=b.id AND || !(b.money!=100) || (b.number=2).
!(a.id = b.id AND || !(b.money!=100) || !( b.number=2).
逻辑 AND 和 逻辑 OR表达式,其操作数是从左到右求值的。如果第一个参数做够判断操作结果,那么第二个参数便不会被计算求值(短路效果)。
下面语句与该语句效果相同:(这里相同指的是最后只用到左表数据,若是将右表数据写出来是不一样的)
SELECT a.* FROM a LEFT JOIN b
ON a.id=b.id
WHERE b.id is null OR b.money=100 OR b.number=1;
将on的否定条件写在where后,效果相同。