SQL语法——leftjoinon多条件
left join on +多条件与where区别
重点
先匹配,再筛选where条件。
本⽂将通过⼏个例⼦说明两者的差别。
表1:product
id amount
1100
2200
3300
4400
表2:product_details
id weight exist
2220
4441
5550
6661
1. 单个条件
select * from product a
left join product_details b
on a.id = b.id
以左表为准匹配,结果:
id amount id weight exist 1100null null null 22002220 3300null null null 44004441 2. 条件写在on 与where区别
查询1:
SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
AND product.amount=200;
结果:
id amount id weight exist
1100null null null
22002220
3300null null null
4400null null null
sql left join 多表连接把on的所有条件作为匹配条件,不符合的右表都为null。
查询2:
SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
WHERE product.amount=200;
id amount id weight exist
22002220
匹配完再筛选,结果只有⼀条记录。
3. where XXX is null 情况
使⽤该语句表⽰:删除掉不匹配on后⾯条件的记录。
where XXX is not null 则表⽰筛选出符合on后⾯条件的记录。
常⽤于只需要左表的数据,⽐如count id这类。
SELECT a.* FROM product a LEFT JOIN product_details b
ON a.id=b.id AND b.weight!=44 ist=0
WHERE b.id IS NULL;
结果:
id amount
1100
3300
4400
可以直观看出,只有id=2的纪录完全匹配上三个条件,所以筛除这条纪录,另三条保留,此时这三条纪录的右表均为null。
筛选出不符合on后⾯条件的,即 !( AND b.weight!=44 ist=0).
!( AND || !(b.weight!=44) || !(b.exist=0).
( != AND || (b.weight = 44) || ( b.exist! = 0).
逻辑 AND 和 逻辑 OR表达式,其操作数是从左到右求值的。如果第⼀个参数做够判断操作结果,那么第⼆个参数便不会被计算求值(短路效果)。
下⾯语句与该语句效果相同:(这⾥相同指的是最后只⽤到左表数据,若是将右表数据写出来是不⼀样的)
SELECT a.* FROM product a LEFT JOIN product_details b
ON a.id=b.id
WHERE b.id is null OR b.weight=44 ist=1;
将on的否定条件写在where后,效果相同。
注:
如果你使⽤ LEFT JOIN 来寻在⼀些表中不存在的记录,你需要做下⾯的测试:WHERE 部分的 col_
name IS NULL,MYSQL 在查询到⼀条匹配 LEFT JOIN 条件后将停⽌搜索更多⾏(在⼀个特定的组合键下)。
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论