关于sql:INNER JOIN vs“FROM”中的多个表名


INNER JOIN vs multiple table names in “FROM”

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
INNER JOIN versus WHERE clause — any difference?

内部联接查询和隐式联接查询(在FROM关键字后列出多个表)之间的区别是什么?例如:

给出以下两个表:

1
2
3
4
5
6
7
8
9
10
11
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查询有什么区别?从我做的测试中,它们返回相同的结果。他们做同样的事吗?是否存在返回不同结果集的情况?

1
2
3
SELECT s.description FROM Documents d, Statuses s WHERE d.statusId = s.id AND d.id = 9;

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


如果你是第一种方式,30岁以下的人可能会嘲笑你,但是只要你做了一个内部连接,他们就会产生相同的结果,优化器就会生成相同的执行计划(至少据我所知)。

当然,这假定第一个查询中的WHERE子句是您将如何加入第二个查询的。

这可能会作为一个副本关闭,顺便说一句。


没有理由使用隐式联接(带有逗号的联接)。是,对于内部联接,它将返回相同的结果。但是,它可能会因疏忽而导致交叉联接,特别是在复杂查询中,而且很难进行维护,因为不同供应商的左/右外部联接语法(在SQL Server中已弃用,但现在仍然无法正常工作)不同。由于不应该在同一个查询中混合隐式联接和显式联接(可能会得到错误的结果),需要将某些内容更改为左联接意味着重写整个查询。


第二个方法的好处在于它有助于将连接条件(on…)与过滤条件(where…)分开。这有助于提高查询的可读性。

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

筛选条件更能描述查询正在执行的特定任务。如果查询是findrichpeople,则where子句可能是"where sales.salary>1000000"…这是在描述手头的任务,而不是数据库结构。

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


第一个是在这两个表中的所有记录上做笛卡尔积,然后按WHERE子句过滤。

第二个只连接满足on子句要求的记录。

编辑:正如其他人所指出的,优化引擎将处理对笛卡尔产品的尝试,并或多或少地导致相同的查询。


据我所知,没有区别的是,第二种是用内部连接的新方法来编写这样的语句,第一种是旧方法。


在您给出的示例中,查询是等效的;如果您使用的是SQL Server,请运行查询并显示实际的执行计划,以查看服务器在内部执行的操作。


有点像。可以帮助你。

  • 左联接与SQL(A)中的多个表
  • 左联接与SQL中的多个表(B)