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


Answers:


184

为了:

FROMJOIN ■确定与过滤器的行
WHERE行上多个滤波器
GROUP BY结合的那些行成组
HAVING滤波器组
ORDER BY排列其余的行/组
LIMIT上剩余的行/组过滤器


有什么参考吗?
歌山

3
@葛山,看看SET SHOWPLAN_ALL ON
KM。

嗨,我有一个问题。条件条件时的case语句会覆盖where条件吗?
MAX

1
那么选择条款呢。在最后吗?
MAX

简明扼要的答案!谢谢!
Abhishek Ghosh

14

这是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获得有关它的更多信息


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val加入后在这里出现ON,选择首先出现,有什么解释吗?
新手

这只是编写SQL语句的语法。我提到的顺序是SQL引擎评估的真实顺序。这意味着,如果您的查询语法正确,那么引擎将FROM首先求值,然后ON依此类推。
Suman Kabir博士

1
@ShailajaGuptaKapoor您可以阅读此blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Suman Kabir

8

首先是WHERE,然后是查询的结果分组,最后但并非最不重要的是,采用HAVING子句来过滤分组的结果。这是“逻辑”命令,我不知道这在引擎上是如何实现的。


2
值得补充的是,如果优化器不依赖聚合,它们可能会将子句从HAVING移到WHERE。这不会影响显示的结果。
Damien_The_Unbeliever,2009年

2

我认为它是在引擎中实现的,正如Matthias所说:在哪里,GROUP BY,有

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

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


您链接到:-)的解释非常好。
sleske

1
链接已死。如果您能解决问题,那就太好了:)
Akash KC

2

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

Where
Group By
Having

要么

Where 
Having
Group by

1

考虑一下如果您想实施的话,您需要做些什么:

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

订单是WHERE,GROUP BY和HAVING。


您在这里所做的解释非常出色。它清除了我对HAVING的怀疑。总结一下-GROUP BY&HAVING与SELECT&WHERE一样。HAVING子句始终在具有表中GROUP BY条件且不在ON GROUPED数据上的COMPLETE表数据上运行。
Naveen Kumar

1

在下面的顺序

  1. 从和加入
  2. 哪里
  3. 通过...分组
  4. 拥有
  5. 选择
  6. 订购
  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中选择count()count,由TEACH进行count()> 1组;

教学数量


朗格2遗嘱4


0

这是查询执行的SQL顺序,

在此处输入图片说明

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

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

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

参考文献:


-2

SELECT
FROM
JOIN的
WHERE
GROUP BY
HAVING
ORDER BY


13
这实际上是错误的。根据MS认证培训师和官方培训材料,Order By是Select之后的。考虑时有点逻辑。订购尚未提取和粘贴的虚拟表将是愚蠢的。:)
simme 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.