【问题标题】:Execution sequence of Group By, Having and Where clause in SQL Server?SQL Server中Group By、Having和Where子句的执行顺序?
【发布时间】:2009-07-15 08:10:59
【问题描述】:

当我们将GROUP BYHAVINGWHERE 子句一起使用时,我只是对SQL 查询的执行顺序感到困惑。哪个先被执行?顺序是什么?

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    按顺序:

    FROMJOIN 确定和过滤行
    WHERE 行上的更多过滤器
    GROUP BY 将这些行组合成组
    HAVING 过滤组
    ORDER BY 排列剩余的行/组
    LIMIT过滤剩余的行/组

    【讨论】:

    • 这个有参考吗??
    • @Geshan,关注SET SHOWPLAN_ALL ON
    • 嗨,我有一个问题。 case 语句 when 条件会覆盖 where 条件吗?
    • 选择子句怎么样。是在最后吗?
    • 简短的回答!谢谢!
    【解决方案2】:

    这是 sql server 的完整序列:

    1.  FROM
    2.  ON
    3.  JOIN
    4.  WHERE
    5.  GROUP BY
    6.  WITH CUBE or WITH ROLLUP
    7.  HAVING
    8.  SELECT
    9.  DISTINCT
    10. ORDER BY
    11. TOP
    

    所以从上面的列表中,你可以很容易理解GROUP BY, HAVING and WHERE的执行顺序是:

    1.  WHERE
    2.  GROUP BY
    3.  HAVING
    

    Get more information about it from Microsoft

    【讨论】:

    • SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val 这里是加入后ON,先选择,有什么解释吗?
    • 这只是写SQL语句的语法。我提到的顺序是 SQL 引擎评估的真实顺序。这意味着如果您的查询语法正确,那么引擎首先评估 FROM,然后是 ON,依此类推。
    • @ShailajaGuptaKapoor 你可以阅读这个blogs.x2line.com/al/archive/2007/06/30/3187.aspx
    • 如果 WHERE 出现在 SELECT 之前,为什么会返回一行?从 foo 中选择 sum(1) 其中 1 = 0
    【解决方案3】:

    首先是 WHERE,然后对查询结果进行 GROUP,最后但并非最不重要的 HAVING 子句用于过滤分组结果。这是“合乎逻辑”的顺序,我不知道这在技术上是如何在引擎中实现的。

    【讨论】:

    • 值得补充的是,如果子句不依赖于聚合,优化器可能会将子句从 HAVING 移动到 WHERE。这不会影响显示的结果。
    【解决方案4】:

    这是查询执行的 SQL 顺序,

    您可以通过article 中的示例检查执行顺序。

    对于您的问题,以下几行可能会有所帮助,并且可以直接从 article 获得。

    1. GROUP BY --> 应用 WHERE 约束后的剩余行将根据 GROUP BY 子句中指定的列中的公共值进行分组。作为分组的结果,行的数量与该列中的唯一值一样多。隐含地,这意味着您应该只在查询中有聚合函数时才需要使用它。
    1. HAVING --> 如果查询有 GROUP BY 子句,则 HAVING 子句中的约束将应用于分组行,丢弃不满足约束的分组行。与 WHERE 子句一样,在大多数数据库中也无法通过此步骤访问别名。

    参考资料:-

    【讨论】:

      【解决方案5】:

      我认为它是在引擎中实现的,正如 Matthias 所说:WHERE、GROUP BY、HAVING

      试图在网上找到列出整个序列的参考资料(即“SELECT”出现在底部),但我找不到。我不久前读过的一本“Inside Microsoft SQL Server 2005”一书中详细介绍了这一点,作者是 Solid Quality Learning

      编辑:找到一个链接:http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx

      【讨论】:

      • 您链接到的非常好的解释:-)。
      • 链接已失效。如果你能解决这个问题,那就太好了:)
      【解决方案6】:

      在下面的顺序中

      1. 从 & 加入
      2. 在哪里
      3. 分组方式
      4. 拥有
      5. 选择
      6. 订购方式
      7. 限制

      【讨论】:

        【解决方案7】:

        在 Oracle 12c 中,您可以按以下任一顺序运行代码:

        Where
        Group By
        Having
        

        或者

        Where 
        Having
        Group by
        

        【讨论】:

          【解决方案8】:

          想想如果你想实现你需要做什么:

          • WHERE:需要执行JOIN操作。
          • GROUP BY:您指定 Group by 以“分组”连接上的结果,然后它必须在 JOIN 操作之后,在 WHERE 使用之后。
          • HAVING:HAVING 用于过滤,如 GROUP BY 表达式所说。然后,在 GROUP BY 之后执行。

          顺序是 WHERE、GROUP BY 和 HAVING。

          【讨论】:

          • 你在这里解释的很棒。它消除了我对 HAVING 的怀疑。所以总结一下 - GROUP BY & HAVING 的工作方式与 SELECT & WHERE 相同。 HAVING 子句始终在 COMPLETE 表数据上运行,图中采用 GROUP BY 条件,而不是在 GROUPED 数据上。
          【解决方案9】:

          Having 子句可能出现在 group by 子句之前/之前。

          示例: 选择 * FROM test_std; ROLL_NO SNAME DOB TEACH


               1 John       27-AUG-18 Wills     
               2 Knit       27-AUG-18 Prestion  
               3 Perl       27-AUG-18 Wills     
               4 Ohrm       27-AUG-18 Woods     
               5 Smith      27-AUG-18 Charmy    
               6 Jony       27-AUG-18 Wills     
                 Warner     20-NOV-18 Wills     
                 Marsh      12-NOV-18 Langer    
                 FINCH      18-OCT-18 Langer    
          

          已选择 9 行。

          select 教,count() 从 test_std 中计数 计数()> 1 按 T​​EACH 分组;

          教数


          朗格 2 遗嘱 4

          【讨论】:

            【解决方案10】:

            选择
            来自
            加入
            在哪里
            分组依据

            订购方式

            【讨论】:

            • 这实际上是错误的。根据 MS 认证培训师和官方培训材料,Order By 位于 Select 之后。当你想到它时有点合乎逻辑。订购一个您尚未获取和粘合的虚拟表将是愚蠢的。 :)
            • 请注意,上述评论与此答案的早期版本有关。
            猜你喜欢
            • 2021-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-09
            • 1970-01-01
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多