大多数SQL方言同时接受以下两种查询:
SELECT a.foo, b.foo
FROM a, b
WHERE a.x = b.x
SELECT a.foo, b.foo
FROM a
LEFT JOIN b ON a.x = b.x
显然,当您需要外部连接时,需要使用第二种语法。但是,在进行内部连接时,为什么我应该更喜欢第二种语法而不是第一种语法(反之亦然)?
大多数SQL方言同时接受以下两种查询:
SELECT a.foo, b.foo
FROM a, b
WHERE a.x = b.x
SELECT a.foo, b.foo
FROM a
LEFT JOIN b ON a.x = b.x
显然,当您需要外部连接时,需要使用第二种语法。但是,在进行内部连接时,为什么我应该更喜欢第二种语法而不是第一种语法(反之亦然)?
当前回答
对于数据库来说,它们最终是相同的。但是,对于您来说,在某些情况下必须使用第二种语法。为了编辑最终不得不使用它的查询(发现您需要一个左连接,而您有一个直连接),为了一致性,我只在第二个方法上设置模式。这将使阅读查询更容易。
其他回答
如果两者都是内部连接,则在SQL的语义或执行或性能上没有区别。这纯粹是一个偏好的问题,编码标准在你的工作小组。
在过去的25年里,我养成了一个习惯,如果我有一个相当复杂的SQL,我将使用INNER JOIN语法,因为它更容易让读者一眼看出查询的结构。它还通过从剩余条件中分离出连接条件来提供更多的清晰度,这可以节省时间(和错误),如果您在几个月后返回查询的话。
但是对于外部连接,为了清晰起见,我在任何情况下都不会使用非ansi扩展。
第一种方法是较老的标准。第二种方法是在SQL-92中引入的http://en.wikipedia.org/wiki/SQL。完整的标准可以在http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt上查看。
数据库公司花了很多年才采用SQL-92标准。
所以第二种方法是首选的原因,它是根据ANSI和ISO标准委员会的SQL标准。
我听到很多人抱怨第一个太难理解了,它是不清楚的。我不认为它有问题,但在讨论之后,为了清晰起见,我甚至在INNER JOINS上使用了第二个。
对于数据库来说,它们最终是相同的。但是,对于您来说,在某些情况下必须使用第二种语法。为了编辑最终不得不使用它的查询(发现您需要一个左连接,而您有一个直连接),为了一致性,我只在第二个方法上设置模式。这将使阅读查询更容易。
SELECT * FROM table1, table2,…对于几个表来说,语法是可以的,但是随着表数量的增加,它会变得越来越难读(不一定是一个精确的数学语句)。
JOIN语法较难编写(在开始时),但它明确了哪些标准影响哪些表。这让你更不容易犯错。
同样,如果所有的连接都是INNER,那么两个版本是等价的。然而,一旦在语句的任何地方有了OUTER连接,事情就变得复杂得多,实际上可以保证您所编写的内容不会查询您认为您所编写的内容。