分组聚集计算与分组过滤
分组
SQL 可以将检索到的元组按照某一条件进行分类,具有相同条件值得元组划到一个组或一个集合中,同时处理多个组或集合的聚集运算。
分组的基本语法
SELECT 列名|expr|agfunc(列名) [[,列名|expr|agfunc(列名)]...]
FROM 表名1 [,表名2...]
[WHERE 检索条件]
[GROUP BY 分组条件];
分组条件可以是列名1
,列名2
...
示例1:查询每一个学生的平均成绩
表结构
SELECT * FROM sc
+----------------+------------------+-----------------+
| name | course | score |
+----------------+------------------+-----------------+
| Tom | English | 90 |
| Tom | Math | 60 |
| David | english | 100 |
| David | Math | 80 |
+----------------+------------------+-----------------+
SELECT name , AVG(score)
FROM sc
GROUP BY name
+----------------+----------------------+
| name | AVG(score) |
+----------------+----------------------+
| David | 90.0000 |
| Tom | 75.0000 |
+----------------+----------------------+
示例2:查询每一门课程的平均
SELECT course, AVG(score)
FROM sc
GROUP BY course
+------------------+----------------------+
| course | AVG(score) |
+------------------+----------------------+
| English | 95.0000 |
| Math | 70.0000 |
+------------------+----------------------+
聚集函数是不允许用于WHERE子句中的:WHERE子句是对每一元组进行条件过滤,而不是对集合进行条件过滤
分组过滤
若要对集合(分组)进行条件过滤,即满足条件的集合/分组留下,不满足条件的集合剔除。
HAVING
子句,又称分组过滤子句。需要有GROUP BY
子句的支持。换句话说,没有GROUP BY子句,就没有Having子句。
语法
SELECT 列名|expr|agfunc(列名) [[,列名|expr|agfunc(列名)]...]
FROM 表名1 [,表名2...]
[WHERE 检索条件]
[GROUP BY 分组条件 [HAVING 分组过滤条件]];
示例:求不及格课程超过1门的同学的学号
表结构
SELECT * FROM SC
+----------------+------------------+-----------------+
| name | course | score |
+----------------+------------------+-----------------+
| Tom | English | 59 |
| Tom | Math | 59 |
| David | english | 100 |
| David | Math | 80 |
+----------------+------------------+-----------------+
查询
SELECT name FROM sc
WHERE score<60
GROUP BY name HAVING COUNT(*) >= 2
+----------------+
| name |
+----------------+
| Tom |
+----------------+
如果你对本博客有任何的疑问或者建议,欢迎联系作者:QQ944273070