根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果

Posted

技术标签:

【中文标题】根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果【英文标题】:Limiting SQL results based on JOIN ON parameter(s) or WHERE parameter(s) 【发布时间】:2013-09-18 17:37:51 【问题描述】:

我正在尝试确定在 mysql 查询中的 JOIN ON 子句或 WHERE 子句本身中使用选择参数是否有任何已知的好处。

我确信并知道返回的结果是相同的,在本地测试时,“查询时间”似乎几乎可以忽略不计,但想看看是否有任何专家意见。

这两者在后端有区别吗?如果有,首选哪个?

v1

SELECT
  *
FROM users a
JOIN user_photos b ON (b.userid = a.userid)
WHERE
  a.userid = 12345
  AND b.photo_type = 1

或 v2

SELECT
  *
FROM users a
JOIN user_photos b ON (b.userid = a.userid AND b.photo_type = 1)
WHERE
  a.userid = 12345

【问题讨论】:

使用EXPLAIN,看看执行计划是否不同。 我认为 INNER JOIN 没有区别。会有一个 LEFT JOIN。 我倾向于只在JOIN 子句中使用字段到字段的条件,其他任何内容,或者当涉及常量时,倾向于进入 WHERE 子句。使用常规的 INNER 连接,它们可能在功能上是相同的。 @Barmar - 解释执行计划是相同的 - 基于结果,我确实认为它们是相同的,但想知道是否有任何后端内容根据查询的布局方式发生变化 如果执行计划相同,则执行相同的工作。 【参考方案1】:

只要没有外连接,结果集就没有区别。 并且所有并非完全愚蠢的优化器都会对这两个版本一视同仁。

【讨论】:

【参考方案2】:

两个查询将提供相同的性能,并将在相同的时间内执行。两者的执行计划相同

V1 执行计划

V2 执行计划

【讨论】:

有趣的软件——如果你不介意我问,它是什么? SQL Server 管理工作室。 它的 sql server 管理工作室 (SSMS)。您有一个名为 include execution plan 的选项,它有助于为您的查询生成执行计划,您可以使用它优化查询性能。

以上是关于根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql的inner join,left jion,right join,cross join以及on和where的区别

mysql left join中where和on条件的区别

`INNER JOIN` 过滤条件在查询中的位置; `ON` 或 `WHERE` 子句 [关闭]

MySql 之 left join 查询结果

sql语句中left join和inner join中的on与where的区别分析

SQL 优化