INNER JOIN vs"FROM"中的多个表名

Mic*_*ael 22 sql

可能重复:
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);
Run Code Online (Sandbox Code Playgroud)

这两个SQL查询之间有什么区别?从我完成的测试中,他们返回相同的结果.他们做同样的事情吗?是否存在返回不同结果集的情况?

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;
Run Code Online (Sandbox Code Playgroud)

Jor*_*dan 14

如果你是第一种方式,那么30岁以下的人可能会对你轻笑,但只要你进行内连接,他们就会产生相同的结果,优化器会生成相同的执行计划(至少如就像我曾经说过的那样).

这当然假定第一个查询中的where子句是您在第二个查询中加入的方式.

这可能会被重复关闭,顺便说一下.

  • 我不到30岁,所以我想这就是为什么我一直使用INNER JOINs :)的原因。我认为它在审美上看起来更令人愉悦。 (2认同)

HLG*_*GEM 8

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


dan*_*and 6

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

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

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

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