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子句是您在第二个查询中加入的方式.
这可能会被重复关闭,顺便说一下.
没有理由使用隐式连接(带逗号的连接).对于内部联接,它将返回相同的结果.但是,它会受到无意的交叉连接,尤其是在复杂查询中,并且维护起来比较困难,因为左/右外连接语法(在SQL Server中已弃用,现在无法正常工作)因供应商而异.由于您不应在同一查询中混合使用隐式和显式连接(您可能会得到错误的结果),因此需要将某些内容更改为左连接意味着重写整个查询.
第二种方法的好处在于它有助于将连接条件(on ...)与过滤条件(其中......)分开.这有助于使查询的意图更具可读性.
连接条件通常更具描述性的数据库结构和表之间的关系.例如,工资表通过EmployeeID列与employee表相关,涉及这两个表的查询可能总是在该列上连接.
过滤条件更能描述查询正在执行的特定任务.如果查询是FindRichPeople,则where子句可能是"where salaries.Salary> 1000000"......那就是描述手头的任务,而不是数据库结构.
请注意,SQL编译器没有这样看...如果它决定交叉连接然后过滤结果会更快,它将交叉连接并过滤结果.它不关心ON子句中的内容和WHERE子句中的内容.但是,如果on子句匹配外键或连接到主键或索引列,通常不会发生这种情况.就操作正确而言,它们是相同的; 至于编写可读,可维护的代码,第二种方式可能会好一点.
| 归档时间: |
|
| 查看次数: |
23632 次 |
| 最近记录: |