Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “中的内部联接与多个表名”;从「;_Sql - Fatal编程技术网

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 Server,请运行查询并显示实际执行计划,以查看服务器在内部执行的操作。

第二种方法的优点在于,它有助于将连接条件(打开…)与筛选条件(其中…)分开。这有助于提高查询的可读性

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

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


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

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

没有区别。第二个是更好的语法,它使连接条件更清晰,而无需查看其他地方,并有助于避免无意中的交叉连接。我不到30岁,所以我想这就是我一直使用内部连接的原因:)。我认为它看起来更美观。这是SQL在英语中所说的,但RDBMS引擎并没有那么简单。优化引擎根本不会生成笛卡尔积。@Dems答案是有效的。这就是SQL语法所表明的。RDBMS的优化引擎如何处理SQL语法是另一个主题。然而,您关于发动机优化的声明是有效的。我将添加注释。同意,我只是想说问题的表达方式并不总是与RDBMS采取的实际操作直接相关。它只对结果实施逻辑约束,而不是如何得出结果。它已经有19年的历史了,几乎不是“新”的方式。好吧,让我们称之为更新方式;)“在SQL Server中甚至不推荐使用”--请引文。在网上查找书籍搜索不推荐的功能[SQL Server]我看到
使用*=和=*
是不推荐的(),但这类似于
外部联接
。你能告诉我我在找什么类似于
内部连接的措辞吗?再次感谢……我必须说,我很难相信SQL Server团队会反对核心SQL-92功能。我没有说内部连接被反对,只是外部连接被反对。