分组的过滤方式

1、分组

  • 分组允许数据分为多个逻辑组,以便能对每个组进行聚集计算。
  • GROUP BY子句指示MYSQL分组数据,然后对每个组而不是整个结果集进行聚集。
  • GROUP BY必须出现在WHERE子句之后,ORDER BY子句之前。
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
  • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果有多行NULL值,它们将分为一组。

例如,对以下表进行分组操作:

+----+--------+---------+-------+
| id | name   | subject | score |
+----+--------+---------+-------+
|  1 | 张三   | 语文    |    80 |
|  2 | 李四   | 语文    |    90 |
|  3 | 王五   | 语文    |    60 |
|  4 | 王胖子 | 数学    |    59 |
|  5 | 张王五 | 英语    |  59.9 |
|  6 | 吴彦祖 | 英语    |  99.9 |
|  7 | 郭德纲 | 数学    |   100 |
|  8 | 郭敬明 | 数学    |    99 |
|  9 | 郭靖   | 英语    |    70 |
+----+--------+---------+-------+

统计各个科目的人数,可得:

mysql> SELECT subject, COUNT(*) AS count FROM score GROUP BY subject;
+---------+-------+
| subject | count |
+---------+-------+
| 语文    |     3 |
| 数学    |     3 |
| 英语    |     3 |
+---------+-------+
3 rows in set (0.01 sec)

2、使用WHERE进行过滤

对成绩超过60分的数据根据科目进行分组:

mysql> SELECT subject, COUNT(*) AS count FROM score WHERE score>=60 GROUP BY subject;
+---------+-------+
| subject | count |
+---------+-------+
| 语文    |     3 |
| 英语    |     2 |
| 数学    |     2 |
+---------+-------+
3 rows in set (0.00 sec)

3、使用HAVING进行过滤

对科目进行分组并过滤出平均成绩高于80分的科目:

mysql> SELECT subject, AVG(score) AS avg FROM score GROUP BY subject HAVING AVG(score)>=80;
+---------+------+
| subject | avg  |
+---------+------+
| 数学    |   86 |
+---------+------+
1 row in set (0.00 sec)

4、两种过滤方式的区别

  • WHERE过滤行,HAVING 过滤分组。
  • WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
  • 整体的语法格式:
select column,group_function(column)
from table
[where condition]
[group by group_by_expression]
[having group_condition]
[order by column]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。