我应该在下面的场景中何时使用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列,而第二个查询将有两个。这会显着影响查询的速度吗?
答案 0 :(得分:7)
除了语法错误之外,您将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语法。
答案 1 :(得分:3)
对于内连接,谓词是否放在连接条件或where子句中对结果没有影响。
我把与连接子句中的表相关的东西和与where子句中的过滤相关的东西放在一起。
SELECT *
FROM Persons
JOIN Employee ON Persons.PhoneNumber = Employee.PhoneNumber
WHERE Persons.PhoneNumber = @PhoneNumber
答案 2 :(得分:0)
JOIN是...连接与外键逻辑连接的表的正确选择。原因是您可以设置不同类型的连接(左,右,内,外)。
对行进行更多逻辑过滤。
在你的简单例子中,两者之间并没有真正的区别。