有人可以帮助解释为什么不使用SQL JOIN是不好的做法和错误?

时间:2011-12-20 20:49:41

标签: mysql sql join

  

可能重复:
  Explicit vs implicit SQL joins
  SQL JOIN: is there a difference between USING, ON or WHERE?

我正在查看由不熟悉SQL的开发人员维护的代码。我在他的代码中经常看到以下片段:

SELECT *
FROM person, status
WHERE person.status_id = status.id

我已向他建议他使用以下内容:

SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id

他指出,在这种特殊情况下,两个查询在相同的时间范围内返回相同的结果(67毫秒中的34k行)。我的新查询在这种情况下没有改变任何事实这一事实证明了这种方法没有任何问题。我曾尝试向他解释笛卡尔等产品,但他坚持认为这种方法没有任何问题。有人可以帮助提供负面的例子,说明依赖于此会失败的地方,和/或为什么从实施的角度来看这种查询行是危险的?

3 个答案:

答案 0 :(得分:10)

确实,两种语法形式都应该给出相同的结果,并且内部MySQL以完全相同的方式执行它们。当前版本的SQL标准支持这两种形式,但仅支持逗号样式以便向后兼容。

有一种情况是使用逗号样式语法失败,但它是异国情调:

SELECT * FROM A, B JOIN C ON C.x = A.y;

JOIN运算符的优先级高于逗号。因此,当上述查询尝试评估C.x = A.y时,它甚至不知道A是查询的一部分。所以你得到一个错误:

ERROR 1054 (42S22): Unknown column 'A.y' in 'on clause'

最好的补救措施是始终使用JOIN语法而不是混合它们。

此外,您无法使用逗号连接语法进行外连接。 Oracle和Sybase / Microsoft各自发明了自己的专有语法来处理外连接,但其他品牌的RDBMS都不支持。今天,所有当前版本的RDBMS(包括Oracle和Sybase / Microsoft)都支持标准的JOIN语法,因此没有充分的理由使用特定于旧的供应商特定扩展。

答案 1 :(得分:0)

这只是一种语法变体。两者都是加入规范。第一个是隐含的。第二个是明确的。早期的SQL标准没有JOIN关键字。

  

有人可以帮助提供依赖于此的失败的负面例子,

没有

  

和/或为什么从实现的角度来看这行查询是危险的?

不是。它只是一种较旧(但仍然完全有效)的语法。

答案 2 :(得分:0)

我认为这是关于可读性的。考虑一下:

SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id where person.sex=1 or status.state='PA'

相反:

SELECT *
FROM person, status
WHERE person.status_id = status.id and person.sex=1 or status.state ='PA'