大多数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

显然,当您需要外部连接时,需要使用第二种语法。但是,在进行内部连接时,为什么我应该更喜欢第二种语法而不是第一种语法(反之亦然)?


当前回答

基本上,当你的FROM子句像这样列出表时:

SELECT * FROM
  tableA, tableB, tableC

结果是表a, B, c中的所有行的叉乘。然后你应用限制WHERE表a。id = tableB。A_id将丢弃大量的行,然后进一步…和表b。id = tableC。B_id,然后你应该只得到那些你真正感兴趣的行。

dbms知道如何优化此SQL,以便使用join编写此SQL的性能差异可以忽略不计(如果有的话)。使用JOIN表示法使SQL语句更具可读性(恕我直言,不使用JOIN会使语句变得一团糟)。使用叉乘,您需要在WHERE子句中提供连接标准,这就是符号的问题所在。你在WHERE从句里塞满了

    tableA.id = tableB.a_id 
AND tableB.id = tableC.b_id 

它只用于限制叉乘。WHERE子句应该只包含结果集的RESTRICTIONS。如果将表连接条件与结果集限制混合使用,您(和其他人)将发现查询更难阅读。您一定要使用join,并保留FROM子句和WHERE子句。

其他回答

第一个和第二个查询可能会产生不同的结果,因为LEFT JOIN包含了第一个表中的所有记录,即使右边的表中没有相应的记录。

第二种是首选的,因为它不太可能因为忘记放置where子句而导致意外交叉连接。没有on子句的连接将无法进行语法检查,没有where子句的旧式连接不会失败,它将进行交叉连接。

此外,当您以后必须使用左连接时,将它们都置于相同的结构中对维护是有帮助的。旧的语法自1992年以来就已经过时了,现在早就该停止使用它了。

另外,我发现许多只使用第一种语法的人并不真正理解连接,而理解连接对于在查询时获得正确的结果至关重要。

对于数据库来说,它们最终是相同的。但是,对于您来说,在某些情况下必须使用第二种语法。为了编辑最终不得不使用它的查询(发现您需要一个左连接,而您有一个直连接),为了一致性,我只在第二个方法上设置模式。这将使阅读查询更容易。

SELECT * FROM table1, table2,…对于几个表来说,语法是可以的,但是随着表数量的增加,它会变得越来越难读(不一定是一个精确的数学语句)。

JOIN语法较难编写(在开始时),但它明确了哪些标准影响哪些表。这让你更不容易犯错。

同样,如果所有的连接都是INNER,那么两个版本是等价的。然而,一旦在语句的任何地方有了OUTER连接,事情就变得复杂得多,实际上可以保证您所编写的内容不会查询您认为您所编写的内容。

我听到很多人抱怨第一个太难理解了,它是不清楚的。我不认为它有问题,但在讨论之后,为了清晰起见,我甚至在INNER JOINS上使用了第二个。