一尘不染

在SQL / MySQL中,join语句中的“ ON”和“ WHERE”有什么区别?

mysql

以下语句给出相同的结果(一个使用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?谢谢。


阅读 304

收藏
2020-05-17

共1个答案

一尘不染

WHERESELECT整个查询ON的一部分,是每个单独联接的一部分。

ON 只能引用以前使用的表的字段。

如果与左表中的记录没有实际匹配,则从右表中LEFT JOIN返回一条记录,并将所有字段设置为NULLSWHERE子句然后对此进行评估和过滤。

在您的查询中,仅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,因此仅返回从未发送过的礼物。

2020-05-17