SQL 查询条件放到 JOIN 子句与 WHERE 子句的差别

我们再写 SQL 的时候,最常碰到一个问题就是,把查询条件放到 JOIN 子句和放到 WHERE 子句有什么不同呢?比如:

查询条件放到 JOIN 语句

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts JOIN wp_skus sku ON sku.post_id = wp_posts.ID AND sku.type=1 WHERE 1=1 AND wp_posts.post_type = 'product' AND wp_posts.post_status = 'publish' ORDER BY sku.price DESC, wp_posts.post_date DESC LIMIT 0, 10

查询条件放到 WHERE 语句

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts JOIN wp_skus sku ON sku.post_id = wp_posts.ID WHERE 1=1 AND wp_posts.post_type = 'product' AND wp_posts.post_status = 'publish' AND sku.type=1 ORDER BY sku.price DESC, wp_posts.post_date DESC LIMIT 0, 10

结果分两种情况:

INNER JOIN:简单说如果使用的是 INNER JOIN,这两种查询的结果相同。但是语义上:JOIN - 描述两个表之间的关系WHERE - 从结果集中删除行。这两种方法直接存在显著的语义上的差别,尽管两种方法对结果和性能都无影响,但是选择正确的语法将有助于代码更易于被阅读。

OUTER JOIN:如果使用的是 OUTER JOIN,可能会不同,比如上面的 SQL 改成 LEFT JOIN,并且连接条件失败,则查询条件放到 JOIN 子句仍将获得一行,但是如果放到 WHERE 子句,则它将被过滤掉,因为 NULL 不等于 1


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。