3

我希望可以发这样的帖子。

我使用 SQL 已经有一段时间了,工作人员一直在使用 2 种不同的方式在数据库中返回相同的数字或行。

例如:

SELECT Name
FROM
    Employees
WHERE
    DepartmentID IN (SELECT DepartmentID
                         FROM
                             Departments
                         WHERE
                             Department LIKE '%Engineering')

SELECT Employees.Name
FROM
    Departments
    INNER JOIN Employees
        ON Departments.DepartmentID = Employees.DepartmentID
WHERE
    Departments.Department LIKE '%Engineering'

两者都返回相同的数据。人们一直告诉我,使用子查询是最好的方法。

我的问题是:这两个中的哪一个会执行得更快?我的猜测将是具有内部连接的那个,但我可能是错的。

谢谢。

4

3 回答 3

5

在这种情况下,两者是等价的。但是,对于具有 INNER JOIN 的部门,如果选择了多个具有相同 DepartmentID 的部门,则具有该 DepartmentID 的员工将被多次返回。

SQL 是一种声明性语言,这意味着该语言不应该说明应该如何执行查询,而应该说明应该找到什么结果。由 DMBS 决定如何执行它。

一个体面的 SQL 数据库可能会优化它们以完成相同或相似的事情。

要检查他们是否在做同样的事情,EXPLAIN请在查询上运行。

如果它们具有相同的步骤,显然它们将花费相同的时间来运行。否则,您将看到数据库处理不同的方式。DBMS 如何优化它取决于实现。所以最好的方法是使用EXPLAIN.

注意:EXPLAIN 是一个 SQL 命令,就像 SELECT 等一样。参见http://www.sql.org/sql-database/postgresql/manual/sql-explain.html

假设它以相同的步骤执行,那么您编写它的方式将是您认为最清楚意图的方式。

于 2012-08-21T21:06:02.903 回答
4

这两个查询是不等价的。等效于“IN”查询如下:

SELECT Name
FROM Employees e join
     (SELECT distinct DepartmentID
      FROM Departments
      WHERE Department LIKE '%Engineering'
     ) d
     on e.DepartmentID = d.DepartmentId

换句话说,“IN”版本永远不会返回重复的行。连接版本可以返回重复的行。在这种情况下,我认为不会,因为 departmentid 在表中可能是唯一的。

下一个问题是关于优化的。SQL 引擎确实应该等效地优化这两个版本。这意味着“IN”版本更易于阅读。

然而,这有一个很大的例外。MySQL 在 IN 方面绝对不是最理想的。使用该数据库引擎时,使用联接版本要好得多。

顺便说一句,还有其他方法可以做到这一点,例如:

select name
from employees e
where exists (select 1 from Departments d
              where e.Departmentid = d.DepartmentId and
                    d.Department LIKE '%Engineering'
             )

哪个效果最好。. . 你需要测量你正在使用的任何数据库。

于 2012-08-21T21:13:18.487 回答
0

大多数现代 RDBMS 中的查询优化器可能会以相同的方式在内部使用它们,因此不会有性能差异。

较旧的 RDBMS 可能会显示出差异,但这取决于 RDBMS 本身。

于 2012-08-21T21:07:43.793 回答