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

ryb*_*ome 4 mysql sql join

可能重复:
显式vs隐式SQL连接
SQL JOIN:USING,ON或WHERE之间有区别吗?

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

SELECT *
FROM person, status
WHERE person.status_id = status.id
Run Code Online (Sandbox Code Playgroud)

我已向他建议他使用以下代码:

SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*win 11

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

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

SELECT * FROM A, B JOIN C ON C.x = A.y;
Run Code Online (Sandbox Code Playgroud)

JOIN操作符比逗号更高的优先级.因此,正如上面的查询试图评估C.x = A.y它甚至不知道这A是查询的一部分.所以你得到一个错误:

ERROR 1054 (42S22): Unknown column 'A.y' in 'on clause'
Run Code Online (Sandbox Code Playgroud)

最好的解决方法是JOIN始终使用语法而不是混合它们.

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