以下语句给出相同的结果(一个使用on,另一个使用where):
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的一部分,是每个单独联接的一部分。
WHERE
SELECT
ON
ON 只能引用以前使用的表的字段。
如果与左表中的记录没有实际匹配,则从右表中LEFT JOIN返回一条记录,并将所有字段设置为NULLS。WHERE子句然后对此进行评估和过滤。
LEFT JOIN
NULLS
在您的查询中,仅gifts返回“ sentgifts”中不匹配的记录。
gifts
这是例子
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,因此仅返回从未发送过的礼物。
NULL
sentgifts.id