这两个sql查询之间有什么区别吗?

时间:2017-08-23 18:11:00

标签: sql

这两个查询之间有什么区别吗?将条件放在JOIN或WHERE部分中是更好还是更快?

SELECT id
FROM fields
INNER JOIN auth
ON a_id = f_a_id
AND a_u_id = $u_id
WHERE id = $id
LIMIT 1

SELECT id
FROM fields
INNER JOIN auth
ON a_id = f_a_id
WHERE id = $id
AND a_u_id = $u_id
LIMIT 1

2 个答案:

答案 0 :(得分:1)

出于所有意图和目的,它们是相同的。将谓词放在WHERE或ON

中没有特别的优势

此建议仅适用于INNER JOIN

答案 1 :(得分:0)

该问题的答案在技术上与DBMS有关,但的答案应该是等同的。

更一般地说,SQL查询描述了您想要的数据,但它并没有告诉数据库如何组装数据。人们有时会通过拼写出他们认为查询所代表的算法来描述查询的各个部分,但这最多只是一个“参考算法”;数据库只需以某种方式提供与此类算法产生的结果相同的结果。这与应用层中典型代码(例如Java,C#,......)的“程序性思维”[1]形成对比。

事实上,不仅数据库可能会为这两个查询选择完全相同的步骤;优化器将有权将查询从一个表示重写到另一个表示,作为其组装执行计划的“推理”的一部分。

有鉴于此,您应该使用最能描述查询的语法。因此,如果谓词描述了来自两个表(或子查询)的行之间的关系 - 例如TABLE_1.ID = TABLE_2.FK_ID等 - 它应该在连接的ON子句中;但从逻辑上讲,它只是对连接数据的过滤器,它应该在WHERE子句中。

正如一些人所指出的,外连接ON子句的语义明显不同;因此,通常需要(或至少谨慎)在ON子句中放置谓词,即使它仅适用于可选表(而不是表之间的关系)。

[1] - 我说“程序性思维”,意思是你的程序是要执行的步骤列表。在具有良好优化的现代环境中,这仍然不完全正确;并且认识到DBMS优化器的不完美之处,人们总是可以忽略用于实现查询的步骤也是不完全正确的。但这些都是各自的理想。

相关问题