【问题标题】:Which gives a faster query? Which is cleaner? JOIN ON or WHERE哪个提供更快的查询?哪个更干净?加入或在哪里加入
【发布时间】:2010-10-08 16:33:45
【问题描述】:

在像下面这样的场景中,我应该什么时候使用 JOIN ON 或 WHERE?

DECLARE
  @PhoneNumber int = 5551234

-- JOIN ON
SELECT *
FROM Persons
JOIN Employees ON Persons.DateOfBirth = Employees.DateOfBirth AND
Persons.PhoneNumber = Employees.PhoneNumber
WHERE Persons.PhoneNumber = @PhoneNumber

-- WHERE
SELECT *
FROM Persons
JOIN Employees ON Persons.DateOfBirth = Employees.DateofBirth
WHERE Persons.PhoneNumber = @PhoneNumber AND Employees.PhoneNumber = @PhoneNumber

我知道第一个查询将有一个 PhoneNumber 列,而第二个查询将有两个。这会显着影响查询速度吗?

【问题讨论】:

  • 这两个查询不能直接比较。对于第二个,您的意思是“WHERE Persons.PhoneNumber = Employee.PhoneNumber”......还是可能是“SELECT * FROM Persons, Employee WHERE Persons.PhoneNumber = Employee.PhoneNumber”?
  • 查询不等价 - 没有必要比较它们的性能。
  • 另外……现在就改掉这个习惯吧! “Persons”表和“Employee”表不同意单数与复数。今天标准化! :)
  • 大声笑鲍勃!我喜欢所有的表名都是复数。
  • 命名约定是主观的,与手头的主题无关。重要的是在命名方案中保持一致。

标签: sql database join


【解决方案1】:

除了语法错误,您将 ANSI-89 JOIN 语法(WHERE 子句中的 JOIN 标准)与 ANSI-92 JOIN 语法(使用 JOIN 关键字)进行比较。

它们的性能相同,但 ANSI-89 缺乏 OUTER JOIN 支持,因此许多数据库都有自定义方法来指示 OUTER 连接:

database     ANSI-89 OUTER JOIN syntax
------------------------------------
Oracle       t1.column = t2.column(+)
SQL Server   t1.column =* t2.column

为了可移植性和可读性——使用 ANSI-92 语法。

【讨论】:

  • 同意小马,旧语法与新语法......完成同样的事情。 Ansi-92 更具可读性
  • 部分问题是关于清洁度的,而 Ansi-92 远比 IMO 更清洁。它将用于连接的条件和用于过滤返回内容的条件分开。
  • SQL Server =* 或 *= 语法目前已损坏,不能保证正确,已弃用。
  • 你确定吗? OP 在两个查询中都有JOIN
  • @Marcus Adams:这就是为什么我以“语法错误......”开始回答的原因 MySQL 是我所知道的唯一允许 JOIN 没有 ON 子句的数据库——它是一个交叉连接,这是您需要指定的语法。
【解决方案2】:

对于内连接,无论谓词放在连接条件还是 where 子句中,结果都没有区别。

我会将与连接表相关的内容放在 join 子句中,将与过滤相关的内容放在 where 子句中。

SELECT *
FROM Persons
JOIN Employee ON Persons.PhoneNumber = Employee.PhoneNumber
WHERE Persons.PhoneNumber = @PhoneNumber

【讨论】:

    【解决方案3】:

    JOIN 是... 连接与外键逻辑连接的表的正确选择。原因是您可以设置不同类型的连接(左、右、内、外)。

    WHERE 更多的是对行的逻辑过滤。

    在您的简单示例中,两者之间没有真正的区别。

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 2011-01-31
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2011-03-03
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多