INNER JOIN 与“FROM”中的多个表名

新手上路,请多包涵

可能重复:

INNER JOIN 与 WHERE 子句——有什么区别吗?

INNER JOIN 查询和 隐式连接 查询(即在 FROM 关键字之后列出多个表)之间有什么区别?

例如,给定以下两个表:

 CREATE TABLE Statuses(
  id INT PRIMARY KEY,
  description VARCHAR(50)
);
INSERT INTO Statuses VALUES (1, 'status');

CREATE TABLE Documents(
  id INT PRIMARY KEY,
  statusId INT REFERENCES Statuses(id)
);
INSERT INTO Documents VALUES (9, 1);

以下两个 SQL 查询有什么区别?

根据我所做的测试,它们返回相同的结果。他们做同样的事情吗?是否存在它们将返回不同结果集的情况?

 -- Using implicit join (listing multiple tables)
SELECT s.description
FROM Documents d, Statuses s
WHERE d.statusId = s.id
      AND d.id = 9;

-- Using INNER JOIN
SELECT s.description
FROM Documents d
INNER JOIN Statuses s ON d.statusId = s.id
WHERE d.id = 9;

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 822
2 个回答

没有理由使用隐式连接(带有逗号的连接)。是的,对于内部连接,它将返回相同的结果。但是,它容易受到无意的交叉连接的影响,尤其是在复杂的查询中,并且更难维护,因为左/右外连接语法(在 SQL Server 中已弃用,它现在无论如何都不能正常工作)因供应商而异。由于您不应该在同一个查询中混合隐式和显式连接(您可能会得到错误的结果),因此需要将某些内容更改为左连接意味着重写整个查询。

原文由 HLGEM 发布,翻译遵循 CC BY-SA 2.5 许可协议

第二种方法的好处是它有助于将连接条件(on …)与过滤条件(where …)分开。这有助于使查询的意图更具可读性。

连接条件通常更能描述数据库的结构和表之间的关系。例如,salary 表通过 EmployeeID 列与employee 表相关联,涉及这两个表的查询可能总是在该列上连接。

过滤条件更能描述查询正在执行的特定任务。如果查询是 FindRichPeople,那么 where 子句可能是“wheresalary.Salary > 1000000”……那是描述手头的任务,而不是数据库结构。

请注意,SQL 编译器不会这样看……如果它决定交叉连接然后过滤结果会更快,它将交叉连接并过滤结果。它不关心 ON 子句中的内容和 WHERE 子句中的内容。但是,如果 on 子句匹配外键或连接到主键或索引列,则通常不会发生这种情况。就正确操作而言,它们是相同的;就编写可读、可维护的代码而言,第二种方法可能要好一些。

原文由 danwyand 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进