【mysql】GROUP BY语句与HAVING语句的使用

一、GROUP BY

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

SELECT column1,  ... column_n, aggregate_function(expression)            
FROM tables            
WHERE predicates            
GROUP BY column1, ... 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就会出错

`GROUP BY` 语句MySQL 中用于对数据集按照特定条件进行分组的重要 SQL 子句。在处理大量数据时,尤其是需要计算各组的数据统计摘要时 (`COUNT`, `SUM`, `AVG`, `MIN`, 或 `MAX`),`GROUP BY` 非常有用。 ### 基本语法: ```sql SELECT column_name(s) FROM table_name WHERE some_condition; // 可选条件过滤行 GROUP BY column_name(s); ``` ### 示例说明: 假设我们有一个名为 `sales` 的表,其中包含 `product_id` 和 `amount` 两个字段。如果我们想找出每个产品的销售总额,我们可以使用下面的查询: ```sql SELECT product_id, SUM(amount) AS total_sales FROM sales GROUP BY product_id; ``` 这里, - `product_id` 字段用来指定分组依据。 - `SUM(amount)` 计算每个产品销售金额的总和,并将其命名为 `total_sales`。 ### 特点及应用: 1. **聚合函数**:除了 `SUM` 外,还可以使用其他聚合函数如 `COUNT`, `AVG`, `MIN`, `MAX` 来进行各种统计分析。 ```sql SELECT product_id, COUNT(*) AS number_of_sales FROM sales GROUP BY product_id; ``` 2. **联接多个列**:可以将多个列作为分组依据。 ```sql SELECT product_id, region, SUM(amount) AS total_sales_per_region_product FROM sales GROUP BY product_id, region; ``` 3. **排除空值**:在 `GROUP BY` 后面加上 `HAVING` 子句可以进一步筛选符合条件的分组。 ```sql SELECT product_id, SUM(amount) AS total_sales FROM sales WHERE amount > 0 GROUP BY product_id HAVING total_sales > 1000; ``` 4. **排序和限制结果**:使用 `ORDER BY` 和 `LIMIT` 对结果进行排序和限制显示的结果数。 ```sql SELECT product_id, SUM(amount) AS total_sales FROM sales GROUP BY product_id ORDER BY total_sales DESC LIMIT 5; ``` ### 结论 `GROUP BY` 语句数据库查询中非常强大的工具,它允许你根据数据的某些属性来进行聚合、过滤和排序,从而更深入地理解和分析数据集。通过结合 `GROUP BY` 与其他 SQL 功能(比如聚合函数、`HAVING`、`ORDER BY` 等),你可以构建出功能强大、灵活且高效的查询解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值