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]
网友评论