sql,SELECT COUNT(*) FROM (SELECT column_name FROM table_name GROUP BY column_name) AS temp;,
“MySQL数据库中的分组查询(GROUP BY)是一种强大的工具,用于将数据按照一个或多个列进行分组,从而对每个组执行聚合函数操作,通过分组查询,用户可以对数据进行更深入的统计分析,例如计算每个组的总数、平均值、最大值等。
基本语法
SELECT 聚合函数, 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY 列名;
常用聚合函数
COUNT(): 计算行数。
SUM(): 求和。
AVG(): 计算平均值。
MAX(): 获取最大值。
MIN(): 获取最小值。
示例与解释
1. 单字段分组查询
假设有一个名为employees
的表,包含以下列:id
(员工ID)、department
(部门)、salary
(工资)。
查询每个部门的平均工资:
SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department;
目的: 计算每个部门的平均工资。
2. 多字段分组查询
查询每个部门的员工数量和平均工资:
SELECT department, COUNT(*) AS num_employees, AVG(salary) AS average_salary FROM employees GROUP BY department;
目的: 统计每个部门的员工数量以及平均工资。
3. 分组前筛选与分组后筛选
查询邮箱中包含“a”字符的每个部门的平均工资:
SELECT department, AVG(salary) AS average_salary FROM employees WHERE email LIKE '%a%' GROUP BY department;
目的: 先根据条件筛选出部分数据,然后按部门分组并计算平均工资。
查询有奖金的每个领导手下最高工资大于12000的工种编号和最高工资:
SELECT manager_id, MAX(salary) AS max_salary FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id HAVING MAX(salary) > 12000;
目的: 在分组后筛选出符合条件的结果。
4. 复杂分组查询
按照员工姓名长度分组,查询每一组员工个数,筛选员工个数大于5的有哪些:
SELECT length(last_name) AS len_name, COUNT(*) AS employee_count FROM employees GROUP BY len_name HAVING COUNT(*) > 5;
目的: 按照员工姓名长度进行分组,并筛选出员工个数大于5的组。
相关问答FAQs
问题1:GROUP BY和ORDER BY有什么不同?
答:GROUP BY用于将结果集按照指定的列进行分组,以便对每个组应用聚合函数,ORDER BY用于对结果集进行排序,可以根据一个或多个列进行升序或降序排列,GROUP BY是用于分组数据的,而ORDER BY是用于排序数据的。
问题2:什么时候应该使用WHERE,什么时候应该使用HAVING?
答:WHERE子句用于在分组之前对数据进行筛选,即在聚合函数处理之前过滤掉不符合条件的记录,HAVING子句用于在分组之后对结果进行筛选,即在聚合函数处理之后过滤掉不符合条件的组,WHERE用于行级别过滤,HAVING用于组级别过滤。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1101451.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复