我在我的 MSSQL 课程中被教导过,这是连接两个表的方法
select * from FirstTable A JOIN SecondTable B on A.ID= B.ID
现在在我的职业生涯中,我遇到了这样的 JOIN 查询
select * from FirstTable A, SecondTable B where A.ID=B.ID
我知道第二种选择曾经是常态,但现在可能已被放弃。
我发现在我加入 6 个以上的表 + 有许多子查询的复杂查询中,第二种形式更容易理解,而且简短而漂亮。
问题
- 我应该使用哪一个?
- 一个比另一个有优势吗?
第二种类型的查询属于某些人所说的 SQL 反模式(查看 Bill Karwin 写的好书)。第二个查询几乎类似于笛卡尔 JOIN,其 WHERE 子句必须即时计算。
首先是更干净,可以更好地管理执行顺序。
您可以通过以下方式比较两种方式
您最好使用 JOIN 语法,因为您可以使用 LEFT JOIN 和 RIGHT JOIN 生成结果集,这可能与 INNER JOIN 有很大不同(可能比 INNER JOIN 更可取)。
This SO posting很好地解释了 ANSI SQL 抱怨中的差异。
虽然这两个查询会产生相同的结果,但我发现显式声明 JOIN 始终是个好主意。它更容易理解,尤其是在 WHERE 子句中包含非 JOIN 相关评估的查询中。
明确说明您的 JOIN 还可以避免您无意中产生笛卡尔积(如 RolandoMySQLSBA 所暗示的那样)。在上面的第二个查询中,如果您(无论出于何种原因)忘记包含 WHERE 子句,您的查询将在没有 JOIN 条件的情况下运行,并返回 FirstTable 中每一行与 SecondTable 中每一行匹配的结果集。除了不返回您想要的内容之外,如果您在大型表(具有数十万甚至数百万行)中犯了这样的错误,您可能会在数据库尝试完成该查询时导致一些性能问题。
你想使用第一种语法。第二种语法已弃用,在某些情况下(奇怪的外部连接情况)可能无法正常工作。