SQL-HAVING子句的深度

SQL-HAVING子句的深度,sql,having-clause,Sql,Having Clause,我试图理解having子句后面可以放置什么条件——它通常是一个条件,使用select语句中的函数,但它也可以包含一个列,在select语句中键入 下面是一个例子: create table r(a int, b int, c int, d int, e int primary key) select a, min(b), sum(c) from r where b > 5 group by a having "condition" 以下哪项可以替代“条件” 当我在SQL中执行此操作时,

我试图理解having子句后面可以放置什么条件——它通常是一个条件,使用select语句中的函数,但它也可以包含一个列,在select语句中键入

下面是一个例子:

create table r(a int, b int, c int, d int, e int primary key)

select a, min(b), sum(c)
from r
where b > 5
group by a
having "condition"
以下哪项可以替代“条件”


当我在SQL中执行此操作时,只有a)不起作用,但它背后的逻辑是什么?

这将是正确的

create table r(a int, b int, c int, d int, e int primary key)

select a, min(b), sum(c)
from r
where b > 5
group by a
having "min(b) >= 6"

HAVING
子句作为过滤器应用于
groupby
之后

如果你牢记这一点,那么很明显:

b=5
失败,因为您没有在查询中按b进行分组,并且
b
按原样使用,而不是在聚合函数中使用

a=SUM(e)
成功,因为您将
按a
分组,并将
a
与聚合函数进行比较

MIN(b)>=6
成功,因为您将聚合函数与常数进行比较


希望这能澄清…

HAVING子句用于聚合函数条件。@Nithin,不是无处不在。HAVING子句被添加到SQL中,因为WHERE关键字不能用于聚合函数。参考因此案例a将不起作用,因为它不是聚合函数。使用过滤器来消除聚合组的结果,表达式
b=5
无效,因为
b
未聚合或分组。好的,它认为现在更清楚了-例如,a=2起作用,因为我们是按a分组的
create table r(a int, b int, c int, d int, e int primary key)

select a, min(b), sum(c)
from r
where b > 5
group by a
having "min(b) >= 6"