SQL Server中Group By,Having和Where子句的执行顺序是什么?

时间:2009-07-15 08:11:00

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

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

10 个答案:

答案 0 :(得分:158)

按顺序:

  

FROM & 加入确定&过滤行
   WHERE 行上的更多过滤器
   GROUP BY 将这些行组合成组    HAVING 过滤群组    ORDER BY 安排剩余的行/组
   LIMIT 过滤剩余的行/组

答案 1 :(得分:7)

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

答案 2 :(得分:6)

以下是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

答案 3 :(得分:2)

我认为它是在马蒂亚斯说的引擎中实现的:WHERE,GROUP BY,HAVING

试图找到一个列出整个序列的在线参考(即“SELECT”在右下方),但我找不到它。我在很久以前就读过的“Inside Microsoft SQL Server 2005”一书详细介绍了Solid Quality Learning

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

答案 4 :(得分:1)

如果您希望实施,请考虑您需要做什么:

  • WHERE :需要执行JOIN操作。
  • GROUP BY :您指定分组依据对分组上的结果进行“分组”,然后它必须在JOIN操作之后,在WHERE使用之后。
  • HAVING :HAVING用于过滤,如GROUP BY表达式所示。然后,它在GROUP BY之后执行。

订单是WHERE,GROUP BY和HAVING。

答案 5 :(得分:1)

以下订单

  1. FROM& JOIN
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. 选择
  6. ORDER BY
  7. LIMIT

答案 6 :(得分:1)

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

Where
Group By
Having

或者

Where 
Having
Group by

答案 7 :(得分:0)

有子句可以在group by子句之前/之前。

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


     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计数()计数 计数()> 1 通过TEACH分组;

教学数量


游侠2 遗嘱4

答案 8 :(得分:0)

这是查询的SQL执行顺序,

enter image description here

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

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

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

参考文献:-

答案 9 :(得分:-2)

选择

JOIN的
WHERE
分组由 HAVING
订购