group by 和having 语句使用

本文介绍了SQL中GROUP BY和HAVING子句的使用方法,包括如何结合聚合函数进行数据分组统计,以及如何利用HAVING子句进一步筛选分组后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、GROUP BY

GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列的结果集。

语法如下:

SELECT column1, column2, ... column_n, aggregate_function (expression)            

FROM tables            

WHERE predicates            

GROUP BY column1, column2, ... column_n;

 

举例

比如说我们有一个学生表格(student),包含学号(id),课程(course),分数(score)等等多个列,我们想通过查询得到每个学生选了几门课程,此时我们就可以联合使用COUNT函数与GROUP BY语句来得到这一结果

SELECT id, COUNT(course) as numcourse

FROM student

GROUP BY id

因为我们是使用学号来进行分组的,这样COUNT函数就是在以学号分组的前提下来实现的,通过COUNT(course)就可以计算每一个学号对应的课程数。

 

注意

因为聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值,要么为GROUP BY语句的参数,否则会出错。

例如,对于上面提到的表格,我们做一个这样的查询:

SELECT id, COUNT(course) as numcourse, score

FROM student

GROUP BY id

此时查询便会出错,错误提示如下:

Column ‘student.score' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

出现以上错误的原因是因为一个学生id对应多个分数,如果我们简单的在SELECT语句中写上score,则无法判断应该输出哪一个分数。如果想用score作为select语句的参数可以将它用作一个聚合函数的输入值,如下例,我们可以得到每个学生所选的课程门数以及每个学生的平均分数:

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore

FROM student

GROUP BY id

 

二、HAVING

HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。

HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。

语法:

SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;

同样使用本文中的学生表格,如果想查询平均分高于80分的学生记录可以这样写:

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore

FROM student

GROUP BY id

HAVING AVG(score)>=80;

在这里,如果用WHERE代替HAVING就会出错

### SQLGROUP BY HAVING 子句的正确使用SQL 查询中,`GROUP BY` 子句用于将结果集按一个或多个列进行分组,而 `HAVING` 子句则用于筛选这些分组后的聚合结果。以下是对这两个子句的详细解释示例。 #### 1. `GROUP BY` 子句 `GROUP BY` 子句的作用是将查询结果按照指定的列进行分组。每个分组可以包含多行数据,通常会聚合函数(如 `COUNT()`、`SUM()`、`AVG()` 等)一起使用以计算每组的统计信息。需要注意的是,`GROUP BY` 子句必须放在 `WHERE` 子句之后,且在 `ORDER BY` 子句之前[^1]。 **语法格式:** ```sql SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1; ``` **示例:** 假设有一个名为 `sales` 的表,包含以下字段:`id`、`product`、`quantity` `price`。如果需要计算每个产品的总销售额,可以使用以下查询: ```sql SELECT product, SUM(quantity * price) AS total_sales FROM sales GROUP BY product; ``` 上述查询将根据 `product` 列对数据进行分组,并计算每种产品的总销售额[^4]。 --- #### 2. `HAVING` 子句 `HAVING` 子句用于在分组后筛选满足特定条件的分组。 `WHERE` 子句不同,`HAVING` 子句只能用于筛选聚合结果,而不能直接作用于单个行[^3]。 **语法格式:** ```sql SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1 HAVING condition; ``` **示例:** 继续以上述 `sales` 表为例,如果需要找出总销售额超过 1000 的产品,可以使用以下查询: ```sql SELECT product, SUM(quantity * price) AS total_sales FROM sales GROUP BY product HAVING SUM(quantity * price) > 1000; ``` 此查询首先根据 `product` 列对数据进行分组,然后筛选出总销售额大于 1000 的分组[^2]。 --- #### 3. 综合示例 下面是一个综合示例,展示了如何结合 `WHERE`、`GROUP BY` `HAVING` 子句来实现复杂查询。 假设需要从 `sales` 表中筛选出销售量大于 5 的产品,并计算其总销售额,同时只保留总销售额超过 1000 的分组: ```sql SELECT product, SUM(quantity * price) AS total_sales FROM sales WHERE quantity > 5 GROUP BY product HAVING SUM(quantity * price) > 1000; ``` --- ### 注意事项 - `GROUP BY` 子句中的列必须出现在 `SELECT` 子句中,或者是聚合函数的参数。 - `HAVING` 子句只能用于筛选分组后的结果,不能直接作用于单个行。 - 如果需要对最终结果进行排序,可以在查询末尾添加 `ORDER BY` 子句。 ```sql SELECT product, SUM(quantity * price) AS total_sales FROM sales WHERE quantity > 5 GROUP BY product HAVING SUM(quantity * price) > 1000 ORDER BY total_sales DESC; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值