以下语句给出相同的结果(一个使用on,另一个使用where):
mysql> select * from gifts INNER JOIN sentGifts ON gifts.giftID = sentGifts.giftID; mysql> select * from gifts INNER JOIN sentGifts WHERE gifts.giftID = sentGifts.giftID; 我只能看到在左外部联接的情况下找到“无与伦比”的情况:( 以找出从未有人发送过的礼物)
mysql> select name from gifts LEFT OUTER JOIN sentgifts ON gifts.giftID = sentgifts.giftID WHERE sentgifts.giftID IS NULL; 在这种情况下,它首先使用on,然后使用where。是否on先做匹配,然后where做“辅助”过滤?还是有使用onvs 的更一般规则where?谢谢。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
WHERE是SELECT整个查询ON的一部分,是每个单独联接的一部分。
ON 只能引用以前使用的表的字段。
如果与左表中的记录没有实际匹配,则从右表中LEFT JOIN返回一条记录,并将所有字段设置为NULLS。WHERE子句然后对此进行评估和过滤。
在您的查询中,仅gifts返回“ sentgifts”中不匹配的记录。
这是例子
gifts
1 Teddy bear 2 Flowers
sentgifts
1 Alice 1 Bob
SELECT * FROM gifts g LEFT JOIN sentgifts sg ON g.giftID = sg.giftID
1 Teddy bear 1 Alice 1 Teddy bear 1 Bob 2 Flowers NULL NULL -- no match in sentgifts
SELECT * FROM gifts g LEFT JOIN sentgifts sg ON g.giftID = sg.giftID WHERE sg.giftID IS NULL
2 Flowers NULL NULL -- no match in sentgifts 如您所见,任何实际的匹配都不能在中留下NULLin sentgifts.id,因此仅返回从未发送过的礼物。来源:stack overflow