![](/img/trans.png)
[英]I want to apply an INNER JOIN and use WHERE condition using 3 tables
[英]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应该以相同的方式对待两者。
一种偏爱是单个表上的过滤器更适合WHERE
和ON
。
对于外部联接,这两个查询是不相同的,您应该使用一个表达您的意图的查询。
连接两个表后的第一个过滤器; 而第二个表使用值过滤作为连接两个表的条件进行连接。 您可以检查此线程:
您可以检查执行两个查询需要花费多少,但是无论如何,您都可以用两种方式编写查询,无论是第一个查询还是第二个查询,优化器都会尝试优化查询。
我喜欢这个规则:
ON ...
说明表之间的关系 。 WHERE ...
筛选结果。 这对于LEFT JOIN
来说很重要,因为ON
不能充当过滤器。
这表明您优化器对待它们的方式相同:
EXPLAIN EXTENDED SELECT ...
SHOW WARNINGS;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.