繁体   English   中英

SQL服务器中Group By、Have和Where子句的执行顺序?

[英]Execution sequence of Group By, Having and Where clause in SQL Server?

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

为了:

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

这是 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

从 Microsoft 获取有关它的更多信息

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

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

试图在网上找到一个列出整个序列的参考(即“SELECT”在底部),但我找不到它。 不久前,Solid Quality Learning 所著的“Inside Microsoft SQL Server 2005”一书中对此进行了详细介绍

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

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

Where
Group By
Having

或者

Where 
Having
Group by

想一想如果你想实施你需要做什么:

  • WHERE :它需要执行 JOIN 操作。
  • GROUP BY :您指定 Group by 对连接的结果进行“分组”,然后它必须在 JOIN 操作之后,在 WHERE 用法之后。
  • HAVING :HAVING 用于按照 GROUP BY 表达式进行过滤。 然后,它在 GROUP BY 之后执行。

顺序是 WHERE、GROUP BY 和 HAVING。

按以下顺序

  1. 来自 & 加入
  2. 在哪里
  3. 通过...分组
  4. 选择
  5. 订购者
  6. 限制

这是执行查询的 SQL 顺序,

在此处输入图片说明

您可以使用本文中的示例检查执行顺序。

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

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

参考:-

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

示例: select * 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 行。

从 test_std 中选择教学、计数( )计数,通过 TEACH具有计数( )> 1 组;

教数


兰格 2 遗嘱 4

  • SELECT
  • 联接(内、左、右、全外联接)
  • 在哪里
  • 通过...分组
  • 拥有
  • 订购方式
  • 限制;

选择

加入
在哪里
通过...分组

订购者

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM