2017-08-15 81 views
3

我通过SQL连接2个表并添加where子句。连接由where子句中的条件完成。 我想知道是否有所区别where子句期望的连接子句是由括号分组。在SQL中,条件是否在连接的情况下分组?

要求示例:是等效于示例2和示例3的示例1?

实施例1(没有分组):

SELECT * FROM employees, vacation 
WHERE employees.first_name = 'Maria' and vacation_start > 2017 
    AND employees.employee_id = vacation.employee_id 

实施例2(除了连接子句一切被分组):

SELECT * FROM employees, vacation 
WHERE (employees.first_name = 'Maria' and vacation_start > 2017) 
    AND employees.employee_id = vacation.employee_id 

实施例3(加入子句是第一其中参数):

SELECT * FROM employees, vacation 
WHERE employees.employee_id = vacation.employee_id 
    AND (employees.first_name = 'Maria' and vacation_start > 2017) 

我一直认为数据库会优化这种查询。 但他们呢?我主要与MariaDB和SQLite合作。

回答

2

是的,它们是等价的。但是,你应该使用明确的加入,而不是老WHERE语法:

SELECT * 
FROM employees 
JOIN vacation 
    ON employees.employee_id = vacation.employee_id 
WHERE employees.first_name = 'Maria' and vacation_start > 2017; 

简单的逻辑:

-- AND has associative property 
cond1 AND cond2 AND cond3 
<=> 
(cond1 AND cond2) AND cond3 
<=> 
cond1 AND (cond2 AND cond3) 
+0

我确实更喜欢显式连接,因为它使表关系清晰。然而,查询是编程库的一个结果,我无法强制从加入选择变体( – capfan

+1

@capfan,'JOIN'语法不是变体 - 它是自1992年以来的标准语法。任何编程都没有任何借口库不支持它。 –

1
  1. 的WHERE条件都不会有问题的顺序,但是你写的表的顺序连接中不物。
  2. 如果您保留加入左侧的记录较少的表会提供更好的性能。
  3. 关于您的WHERE条件,Optimizer将始终将谓词向下推,以加快联接操作。这意味着它将首先在表格上应用条件(employees.first_name ='Maria'和vacation_start> 2017),然后在过滤的记录集上执行join(employees.employee_id = vacation.employee_id)。

    如果您查看您的查询的解释计划,您将更了解它。

1

分组,其中子句仅首先重要的针对你的情况的逻辑表达式。例如;

(A和B和C)

A和(B和C)

是等价的。

但是

(A或B和C)

(A或B)和C

是不同的。

在你的例子中,所有查询都是相同。如果您的数据量非常大,则您的分组选择可能会出现一些性能问题。如果不是没有问题。

相关问题