开发者社区 问答 正文

在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?谢谢。

展开
收起
保持可爱mmm 2020-05-17 18:56:32 498 分享 版权
1 条回答
写回答
取消 提交回答
  • 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

    2020-05-17 18:59:53
    赞同 展开评论