MySQL GROUP BY与HAVING子句实战:统计员工工作天数
在MySQL数据处理中,GROUP BY用于将数据分组合并,而HAVING则用于对分组后的结果进行过滤。本文将结合员工工作记录表的具体实例,详细讲解如何使用这两个子句来统计特定条件下的数据,例如找出工作天数大于1的员工。
基本规则与准备
在使用GROUP BY时,必须遵循一个核心原则:SELECT子句中出现的非聚合列,必须出现在GROUP BY的子句中。例如,若按name分组,则查询字段中只能包含name或聚合函数(如COUNT()、SUM()等)。
以下数据作为本教程的测试基础,这是一张名为employee_tbl的员工工作记录表:
mysql> SELECT * FROM employee_tbl;
+------+--------+------------+--------------------+
| id | name | work_date | daily_typing_pages |
+------+--------+------------+--------------------+
| 1 | John | 2007-01-24 | 250 |
| 2 | Ram | 2007-05-27 | 220 |
| 3 | Jack | 2007-05-06 | 170 |
| 3 | Jack | 2007-04-06 | 100 |
| 4 | Jill | 2007-04-06 | 220 |
| 5 | Zara | 2007-06-06 | 300 |
| 5 | Zara | 2007-02-06 | 350 |
+------+--------+------------+--------------------+
7 rows in set (0.00 sec)
第一步:使用GROUP BY统计每个员工的记录数
目的:了解每个员工在表中出现了多少次(即有多少条工作记录)。
操作:使用COUNT(*)计数并结合GROUP BY name进行分组。
mysql> SELECT name, COUNT(*)
-> FROM employee_tbl
-> GROUP BY name;
执行结果:
+------+----------+ | name | COUNT(*) | +------+----------+ | Jack | 2 | | Jill | 1 | | John | 1 | | Ram | 1 | | Zara | 2 | +------+----------+ 5 rows in set (0.04 sec)
完成状态:此时可以看到Jack和Zara各有2条记录,其他员工各1条。
第二步:结合HAVING筛选符合条件的分组
目的:从上述分组结果中,进一步筛选出工作记录数(即工作天数)大于1天的员工。
区别说明:WHERE不能在GROUP BY之后过滤分组结果,必须使用HAVING子句。
操作:在查询末尾添加HAVING COUNT(*) > 1条件。
mysql> SELECT name, COUNT(*)
-> FROM employee_tbl
-> GROUP BY name
-> HAVING COUNT(*) > 1;
执行结果:
+------+----------+ | name | COUNT(*) | +------+----------+ | Jack | 2 | | Zara | 2 | +------+----------+ 2 rows in set (0.04 sec)
完成状态:查询成功返回了所有工作天数超过一天的员工列表(Jack和Zara)。
总结
GROUP BY负责将数据按指定列归类,而HAVING负责在归类后对聚合结果进行二次过滤。两者结合是处理统计类需求的标准范式。以上就是MySQL中GROUP BY与HAVING结合使用的详细内容,更多关于SQL查询优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









