数据库
首页 > 数据库> > SQL 之 HAVING

SQL 之 HAVING

作者:互联网

HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。往往与 GROUP BY 配合使用,为聚合操作指定条件, WHERE 子句只能指定行的条件,而不能指定组的条件,因此就有了 HAVING 子句,它用来指定组的条件。我们来看个具体示例就清楚了。

SQL HAVING 实例

我们拥有下面这个 "Orders" 表:

现在,我们希望查找订单总金额少于 2000 的客户。

我们使用如下 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
O_IdOrderDateOrderPriceCustomer
12008/12/291000Bush
22008/11/231600Carter
32008/10/05700Bush
42008/09/28300Bush
52008/08/062000Adams
62008/07/21100Carter

结果集类似:

CustomerSUM(OrderPrice)
Carter1700

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。

我们在 SQL 语句中增加了一个普通的 WHERE 子句:

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

结果集:

CustomerSUM(OrderPrice)
Bush2000
Adams2000

HAVING 子句的构成要素

既然 HAVING 操作的对象是组,那么其使用的要素是有一定限制的,能够使用的要素有 3 种:常数 、 聚合函数 和 聚合键 ,聚合键也就是 GROUP BY 子句中指定的列名

示例中的 HAVING COUNT(*) = 3 , COUNT(*) 是聚合函数,3 是常数,都在 3 要素之中;如果有 3 要素之外的条件,会是怎么样呢

SELECT cno, COUNT(*) nums FROM tbl_student_class GROUP BY cno HAVING cname = '影视9班';

执行如上 SQL 会失败,并提示:

[Err] 1054 - Unknown column 'cname' in 'having clause'

在使用 HAVING 子句时,把 GROUP BY 聚合后的结果作为 HAVING 子句的起点,会更容易理解;示例中通过 cno 进行聚合后的结果如下:

图片

聚合后的这个结果并没有 cname 这个列,那么通过这个列来进行条件处理,当然就报错了啦

细心的小伙伴应该已经发现,HAVING 子句的构成要素和包含 GROUP BY 子句时的 SELECT 子句的构成要素是一样的,都是只能包含 常数 、 聚合函数 和 聚合键

https://mp.weixin.qq.com/s/46woqFA6VscqairFsGWXcQ

标签:GROUP,SQL,OrderPrice,子句,聚合,HAVING
来源: https://blog.csdn.net/weixin_38281213/article/details/119317813