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)