繁体   English   中英

内部连接条件或在哪里使用?

[英]inner join on condition or using where?

我有这个查询

SELECT t1.col1
FROM table1 t1
INNER JOIN table2 t2 ON t2.col1 = t1.col1
WHERE t2.col IN (1, 2, 3)

和这个查询

SELECT t1.col1
FROM table1 t1
INNER JOIN table2 t2 ON t2.col1 = t1.col1 AND t2.col IN (1, 2, 3)

都给我一个相同的执行计划,并告诉我

Using where;

这是否意味着我的第二个查询已从优化器转换为第一种形式,并且我应该遵循第一种形式?

有没有办法检查优化器的新查询?

SQL不是过程语言。 这是一种描述性语言。 查询描述您要生成的结果集。

使用内部联接,您的问题中的两个查询是相同的-它们在所有情况下都会产生相同的结果集。 首选哪个是风格偏好。 从优化的角度来看,MySQL应该以相同的方式对待两者。

一种偏爱是单个表上的过滤器更适合WHEREON

对于外部联接,这两个查询是不相同的,您应该使用一个表达您的意图的查询。

连接两个表后的第一个过滤器; 而第二个表使用值过滤作为连接两个表的条​​件进行连接。 您可以检查此线程:

SQL连接:where子句与on子句

您可以检查执行两个查询需要花费多少,但是无论如何,您都可以用两种方式编写查询,无论是第一个查询还是第二个查询,优化器都会尝试优化查询。

我喜欢这个规则:

  • ON ...说明表之间的关系
  • WHERE ... 筛选结果。

这对于LEFT JOIN来说很重要,因为ON不能充当过滤器。

这表明您优化器对待它们的方式相同:

EXPLAIN EXTENDED SELECT ...
SHOW WARNINGS;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM