首页 > 解决方案 > Oracle - 为什么 HAVING 子句可以在 GROUP BY 之前

问题描述

为什么/如何HAVING 子句可以在 GROUP BY 之前

select count(1) from tableA
having id >1
group by id
order by count(1)

我知道HAVING从句可以没有GROUP BY从句,

但是在定义GROUP BY为什么HAVING不被强迫如此作为ORDER BY条款时?

Derby 按以下顺序处理 SelectExpression:

  • FROM 子句
  • WHERE 子句
  • GROUP BY(或隐式 GROUP BY)
  • HAVING 子句
  • ORDER BY 子句

在所有文档中,它出现在GROUP BY

GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                         FROM EMPLOYEE
                         WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)

编辑 Oreilly文章指出顺序并不重要(但不是为什么)

SELECT 语句中 GROUP BY 子句和 HAVING 子句的顺序并不重要。我们可以在 HAVING 子句之前指定 GROUP BY 子句,反之亦然

我怀疑因为HAVING可以没有GROUP BY子句,所以不会强制执行顺序。

标签: oraclegroup-byhaving

解决方案


因为 having 子句对结果起作用(过滤 select 的结果)

查询选择可以仅基于选择,或者如果是聚合查询
,则结果是在 GROUP BY 之后产生的


推荐阅读