1拯辙、分組
- 分組允許數(shù)據(jù)分為多個邏輯組丰涉,以便能對每個組進行聚集計算裳擎。
- GROUP BY子句指示MYSQL分組數(shù)據(jù)涎永,然后對每個組而不是整個結果集進行聚集。
- GROUP BY必須出現(xiàn)在WHERE子句之后鹿响,ORDER BY子句之前羡微。
- GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數(shù))。如果在SELECT中使用表達式惶我,則必須在GROUP BY子句中指定相同的表達式妈倔。不能使用別名。
- 如果分組列中具有NULL值绸贡,則NULL將作為一個分組返回盯蝴。如果有多行NULL值毅哗,它們將分為一組。
例如捧挺,對以下表進行分組操作:
+----+--------+---------+-------+
| id | name | subject | score |
+----+--------+---------+-------+
| 1 | 張三 | 語文 | 80 |
| 2 | 李四 | 語文 | 90 |
| 3 | 王五 | 語文 | 60 |
| 4 | 王胖子 | 數(shù)學 | 59 |
| 5 | 張王五 | 英語 | 59.9 |
| 6 | 吳彥祖 | 英語 | 99.9 |
| 7 | 郭德綱 | 數(shù)學 | 100 |
| 8 | 郭敬明 | 數(shù)學 | 99 |
| 9 | 郭靖 | 英語 | 70 |
+----+--------+---------+-------+
統(tǒng)計各個科目的人數(shù)虑绵,可得:
mysql> SELECT subject, COUNT(*) AS count FROM score GROUP BY subject;
+---------+-------+
| subject | count |
+---------+-------+
| 語文 | 3 |
| 數(shù)學 | 3 |
| 英語 | 3 |
+---------+-------+
3 rows in set (0.01 sec)
2、使用WHERE進行過濾
對成績超過60分的數(shù)據(jù)根據(jù)科目進行分組:
mysql> SELECT subject, COUNT(*) AS count FROM score WHERE score>=60 GROUP BY subject;
+---------+-------+
| subject | count |
+---------+-------+
| 語文 | 3 |
| 英語 | 2 |
| 數(shù)學 | 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 |
+---------+------+
| 數(shù)學 | 86 |
+---------+------+
1 row in set (0.00 sec)
4翅睛、兩種過濾方式的區(qū)別
- WHERE過濾行,HAVING 過濾分組黑竞。
- WHERE在數(shù)據(jù)分組前進行過濾捕发,HAVING在數(shù)據(jù)分組后進行過濾。
- 整體的語法格式:
select column,group_function(column)
from table
[where condition]
[group by group_by_expression]
[having group_condition]
[order by column]