Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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_Database_Join - Fatal编程技术网

Sql 哪个查询速度更快?哪个更干净?在哪里加入

Sql 哪个查询速度更快?哪个更干净?在哪里加入,sql,database,join,Sql,Database,Join,在下面这样的场景中,我应该在何时或何处使用JOIN 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 -

在下面这样的场景中,我应该在何时或何处使用JOIN

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子句中对结果没有影响

SELECT *
FROM Persons
JOIN Employee ON Persons.PhoneNumber = Employee.PhoneNumber
WHERE Persons.PhoneNumber = @PhoneNumber
我会将与连接表相关的内容放在join子句中,并将与筛选相关的内容放在where子句中

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

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

其中更多的是行的逻辑筛选


在您的简单示例中,这两者之间没有实际区别。

除了语法错误,您正在比较ANSI-89连接语法(WHERE子句中的连接条件)和ANSI-92连接语法(使用连接关键字)

它们的性能彼此相同,但ANSI-89缺少外部联接支持,因此许多数据库都有表示外部联接的自定义方法:

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

为了便于移植和可读,请使用ANSI-92语法。

这两个查询不能直接比较。对于第二个问题,您的意思是“WHERE Persons.PhoneNumber=Employee.PhoneNumber”。。。或者可能是“从Persons,Employee中选择*,其中Persons.PhoneNumber=Employee.PhoneNumber”?这些查询并不等价-比较它们的性能没有意义。另外。。。现在就改掉这个习惯吧!“人员”表和“员工”表不同意单数与复数。今日标准化!:)哈哈,鲍勃!我喜欢所有的表名都是复数。命名约定是主观的,与手头的主题无关。重要的是命名方案的一致性。同意小马的说法,旧语法和新语法……完成了同样的事情。Ansi-92的可读性好得多问题的一部分是关于清洁度的,Ansi-92在IMO中更干净。它将用于连接的条件和用于过滤返回内容的条件分开。SQL Server=*或*=语法当前已损坏,不能保证正确,并且已弃用。您确定吗?OP在这两个查询中都有
JOIN
。@Marcus Adams:这就是为什么我在回答时使用了“语法错误…”的原因。MySQL是我所知道的唯一一个允许JOIN而不使用ON子句的数据库——它是一个交叉连接,这是您需要另外指定的语法。