何时进行WHERE过滤?

时间:2013-03-04 16:00:23

标签: sql sql-server

如果我有这样的查询:

SELECT
    A.ID,
    A.Name,
    A.Type,
    B.FirstName,
    B.LastName,
    B.DateOfBirth,
    C.OfficeName
FROM A
    INNER JOIN B ON A.ContactID = B.ID
    INNER JOIN C ON B.OfficeID = C.ID
WHERE
    A.Type = 1

何时应用A.Type = 1过滤器?是在连接之后,还是查询查找'A',确定它是否通过过滤器,然后只加入B和C(如果有)?

希望这是有道理的。感谢。

5 个答案:

答案 0 :(得分:12)

首先,下面是SQL操作顺序:

  • FROM clause
  • WHERE子句
  • GROUP BY子句
  • HAVING条款
  • SELECT条款
  • ORDER BY子句

在简单查询中,过滤发生在FROM子句之后(在此部分找到连接)。你上面所做的是它主要是将表连接到定义它们之间关系的链接列。设置记录后(连接结果),然后会发生WHERE子句以过滤掉Type,其中is等于1.


以下是使用LEFT JOIN

的另一个示例

第一次查询:

SELECT  A.ID,
        A.Name,
        A.Type,
        B.FirstName,
        B.LastName,
        B.DateOfBirth
FROM    A
        LEFT JOIN B 
            ON  A.ContactID = B.ID AND
                B.LastName = 'Michaels'

vs Second Query:

SELECT  A.ID,
        A.Name,
        A.Type,
        B.FirstName,
        B.LastName,
        B.DateOfBirth
FROM    A
        LEFT JOIN B ON  A.ContactID = B.ID
WHERE   B.LastName = 'Michaels'

第一个查询返回表A中的所有记录。 B.LastName = 'Michaels'在表B加入表A之前所做的事情是,它会过滤掉LastName等于Michaels的所有记录。因此,表A中没有匹配表B上的筛选记录的记录将在表B的列上具有 NULL 值。

第二个查询不会与第一个查询产生相同的结果,并且与INNER JOIN执行完全相同,因为在记录加入后,将对结果执行另一个过滤,并仅记录{ {1}}等于 Michaels

答案 1 :(得分:6)

逻辑上 - 在join之后,物理上 - 它取决于优化器。

答案 2 :(得分:4)

MSDN
检查标题为 SELECT语句的逻辑处理顺序

的部分
  
      
  1. FROM
  2.   
  3. ON
  4.   
  5. 加入
  6.   
  7. WHERE
  8.   
  9. GROUP BY
  10.   
  11. WITH CUBE或WITH ROLLUP
  12.   
  13. HAVING
  14.   
  15. 选择
  16.   
  17. DISTINCT
  18.   
  19. ORDER BY
  20.   
  21. TOP
  22.   

在此列表前面的段落末尾有一个重要的注释。

  

请注意,语句的实际物理执行由查询处理器决定,订单可能与此列表不同。

答案 3 :(得分:2)

要回答这个问题,您真的需要查看执行计划。在你提到的情况下,你在where子句中有一个可搜索的参数(SARG),过滤器最有可能在你加入之前应用你的访问方法,即索引,表扫描等。

使用

  

查询菜单 - >包括实际执行计划

  

查询菜单 - >显示预计执行计划

看看。

答案 4 :(得分:1)

在连接之前将应用Where子句,即它将返回A的所有行,B和C中的相应行取决于连接条件和type = 1