可能的重复:
显式与隐式 SQL 连接
SQL JOIN:USING、ON 或 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 行)。在这种情况下,我的新查询没有改变任何内容,这一事实向他证明了这种方法没有任何问题。我尝试向他解释笛卡尔积之类的东西,但他坚持认为这种方法没有任何问题。有人可以帮助提供依赖于此会失败的负面示例,和/或为什么从实现的角度来看这行查询是危险的?
确实,两种形式的语法应该给出相同的结果,并且 MySQL 在内部以完全相同的方式执行它们。当前版本的 SQL 标准支持这两种形式,尽管支持逗号样式只是为了向后兼容。
在某些情况下,使用逗号样式的语法会失败,但它很奇怪:
SELECT * FROM A, B JOIN C ON C.x = A.y;
The 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
语法,因此没有充分的理由使用旧的特定于供应商的扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)