Sql “中的内部联接与多个表名”;从「;
可能重复:Sql “中的内部联接与多个表名”;从「;,sql,Sql,可能重复: 内部联接查询和隐式联接查询(在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 S
内部联接查询和隐式联接查询(在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查询之间有什么区别?根据我所做的测试,它们返回相同的结果。他们做同样的事情吗?是否存在返回不同结果集的情况
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子句是如何加入第二个查询的
顺便说一句,这可能会作为一个副本关闭。第一个对这两个表中的所有记录进行笛卡尔乘积,然后通过where子句进行过滤 第二个仅在满足on子句要求的记录上联接
编辑:正如其他人所指出的,优化引擎将处理对笛卡尔积的尝试,并或多或少地产生相同的查询。有点相同。我可以帮你
请注意,SQL编译器并不这样认为。。。如果它决定交叉连接然后过滤结果会更快,它将交叉连接并过滤结果。它不关心ON子句中的内容和WHERE子句中的内容。但是,如果on子句与外键匹配,或者连接到主键或索引列,则通常不会发生这种情况。就正确操作而言,它们是相同的;就编写可读、可维护的代码而言,第二种方法可能更好一些。没有理由使用隐式连接(带逗号的连接)。是对于内部联接,它将返回相同的结果。但是,它会受到意外交叉连接的影响,特别是在复杂查询中,而且维护起来更困难,因为左/右外部连接语法(在SQL Server中已弃用,但现在它仍然无法正常工作)因供应商而异。由于不应该在同一个查询中混合隐式连接和显式连接(可能会得到错误的结果),因此需要将某些内容更改为左连接意味着重写整个查询。没有区别。第二个是更好的语法,它使连接条件更清晰,而无需查看其他地方,并有助于避免无意中的交叉连接。我不到30岁,所以我想这就是我一直使用内部连接的原因:)。我认为它看起来更美观。这是SQL在英语中所说的,但RDBMS引擎并没有那么简单。优化引擎根本不会生成笛卡尔积。@Dems答案是有效的。这就是SQL语法所表明的。RDBMS的优化引擎如何处理SQL语法是另一个主题。然而,您关于发动机优化的声明是有效的。我将添加注释。同意,我只是想说问题的表达方式并不总是与RDBMS采取的实际操作直接相关。它只对结果实施逻辑约束,而不是如何得出结果。它已经有19年的历史了,几乎不是“新”的方式。好吧,让我们称之为更新方式;)“在SQL Server中甚至不推荐使用”--请引文。在网上查找书籍搜索不推荐的功能[SQL Server]我看到
使用*=和=*
是不推荐的(),但这类似于外部联接
。你能告诉我我在找什么类似于内部连接的措辞吗?再次感谢……我必须说,我很难相信SQL Server团队会反对核心SQL-92功能。我没有说内部连接被反对,只是外部连接被反对。