Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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/7/sql-server/27.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_Sql Server - Fatal编程技术网

Sql 什么时候进行过滤?

Sql 什么时候进行过滤?,sql,sql-server,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过滤器?是在联接之后,

如果我有这样的疑问:

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(如果通过了过滤器)


希望这是有意义的。谢谢。

逻辑上-在
加入之后,物理上-这取决于优化器。

要回答这个问题,您确实需要查看执行计划。在您提到的情况下,如果where子句中有一个可搜索参数(SARG),那么在连接之前,过滤器很可能会与您的访问方法一起应用,即索引、表扫描等

使用

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

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

看一看。

每。
检查SELECT语句的逻辑处理顺序部分

  • 加入
  • 在哪里
  • 分组
  • 使用多维数据集还是使用汇总
  • 拥有
  • 挑选
  • 明显的
  • 订购人
  • 本清单前一段末尾有一个重要注释

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


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

    • FROM子句
    • WHERE子句
    • 分组依据子句
    • 有从句
    • SELECT子句
    • 按条款订货
    在一个简单的查询中,过滤发生在
    FROM
    子句之后(在该部分中可以找到联接)。上面的query主要是将表与其定义关系的链接列连接起来。在设置记录(连接的结果)后,
    WHERE
    子句将过滤掉
    Type
    WHERE is等于1


    下面是另一个使用
    左连接的示例

    第一个问题:

    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第二个查询:

    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
    中的列将具有空值


    第二个查询将不会产生与第一个查询相同的结果,并对
    内部联接执行完全相同的操作
    ,因为在联接记录之后,将对结果执行另一个筛选,并仅获取
    LastName
    等于Michaels的记录。

    where子句将在联接之前应用,即它将根据联接条件返回A的所有行以及B和C的对应行,对于type=1,是否可以包括查询执行计划?这很可能会回答你的问题。我一直认为,查询优化者会找到答案,并将其应用到最理想(或接近最佳)的地方。在SSMS中启用“包含实际查询计划”选项的情况下运行查询,以查看发生了什么。它是否会更改任何内容?当然,只要结果是正确的。SQL Server将使其更高效。@mellamokbtheWise-这只是我好奇的事情。我只是想知道SQL是否遵循任何可靠的规则。通常情况下,答案似乎是‘视情况而定’:)数据库系统教科书将涵盖这一点。通常,
    其中
    条件应尽早处理,因为它们减少了要进一步处理的行集的大小。