软件测试|MySQL HAVING分组筛选详解

简介

在 MySQL 数据库中,HAVING 子句用于在使用 GROUP BY 子句对结果进行分组后,对分组后的数据进行筛选和过滤。它允许我们对分组后的结果应用聚合函数,并基于聚合函数的结果进行条件过滤,从而得到我们需要的最终结果集。本文将详细介绍 HAVING子句的用法,并提供一些实际示例以帮助大家更好地理解其功能。

HAVING 子句的语法

HAVING 子句的基本语法如下:

python 复制代码
SELECT column1, column2, aggregate_function(column)
FROM table
WHERE condition
GROUP BY column1, column2
HAVING aggregate_function(column) condition;

其中,关键要点包括:

  • column1, column2:指定需要进行分组的列。
  • aggregate_function(column):对分组后的数据应用聚合函数,例如 SUM()COUNT()AVG() 等。
  • condition:对分组后的结果应用过滤条件,类似于 WHERE 子句。

HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。

但是 WHERE 和 HAVING 关键字也存在以下几点差异:

  • 一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组。
  • WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。
  • WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。
  • WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。
  • WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。

使用示例

  1. 使用 HAVING 进行分组筛选

假设我们有一个订单表 orders,其中包含以下列:order_idcustomer_idorder_dateorder_amount。我们希望找出每个客户的订单数量大于等于 3 并且订单总金额大于 1000 的客户。

python 复制代码
SELECT customer_id, COUNT(order_id) AS order_count, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING order_count >= 3 AND total_amount > 1000;

在这个示例中,我们首先按照 customer_id 进行分组,然后计算每个客户的订单数量和订单总金额。最后,我们使用 HAVING 子句筛选出满足订单数量大于等于 3 并且订单总金额大于 1000 的客户。

  1. 结合 HAVING 和其他子句

假设我们有一个员工表 employees,包含列 employee_iddepartment_idsalary。我们想要找出每个部门的平均工资大于 50000 的部门,并且只显示平均工资大于 50000 的部门信息。

python 复制代码
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING avg_salary > 50000;

在这个示例中,我们首先按照 department_id 进行分组,然后计算每个部门的平均工资。最后,我们使用 HAVING 子句筛选出平均工资大于 50000 的部门。

总结

HAVING 子句在 MySQL 中用于在分组查询的基础上进行筛选和过滤。它允许我们使用聚合函数计算汇总数据,并基于这些汇总数据进行条件过滤。通过合理地结合 GROUP BYHAVING 子句,我们可以轻松地从数据库中获取满足特定条件的分组数据。

希望本文能够帮助读者更好地理解和使用 HAVING 子句,以及如何在分组查询中进行数据过滤和筛选。通过实际的示例,相信读者已经掌握了在 MySQL 中使用 HAVING 子句的方法和技巧。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
小光学长12 分钟前
基于vue框架的电信用户业务管理系统的设计与实现8ly70(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
程序员不想YY啊27 分钟前
MySQL元数据库完全指南:探秘数据背后的数据
数据库·mysql·oracle
数据最前线31 分钟前
Doris表设计与分区策略:让海量数据管理更高效
数据库
时光追逐者40 分钟前
MongoDB从入门到实战之MongoDB快速入门(附带学习路线图)
数据库·学习·mongodb
头顶秃成一缕光1 小时前
Redis的主从模式和哨兵模式
数据库·redis·缓存
AIGC大时代1 小时前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
博睿谷IT99_1 小时前
数据库证书可以选OCP认证吗?
数据库·oracle·开闭原则·ocp认证
乐维_lwops1 小时前
数据库监控 | MongoDB监控全解析
数据库·mongodb·数据库监控
观无1 小时前
Redis安装及入门应用
数据库·redis·缓存
柏油2 小时前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql