何时进行WHERE过滤?

Bar*_*ast 9 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
Run Code Online (Sandbox Code Playgroud)

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

希望这是有道理的.谢谢.

Joh*_*Woo 12

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

  • FROM子句
  • WHERE子句
  • GROUP BY子句
  • HAVING子句
  • SELECT子句
  • ORDER BY子句

在一个简单的查询中,过滤发生在FROM子句之后(在此部分找到连接).你上面所做的是它主要是将表连接到定义它们之间关系的链接列.在设置记录(连接的结果)之后,WHERE然后发生子句以过滤掉Type等于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'
Run Code Online (Sandbox Code Playgroud)

vs第二次查询:

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'
Run Code Online (Sandbox Code Playgroud)

第一个查询返回表中的所有记录A.是什么B.LastName = 'Michaels'做的是面前的桌子B将与表加入A,它过滤掉所有的记录中,其中LastName等于Michaels.因此,表A中没有匹配表的记录B将在Table 的列上具有NULLB.

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


a1e*_*x07 6

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