分组聚集计算与分组过滤


分组

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            |
+----------------+
posted @ 2019-03-19 10:45  Velscode  阅读(212)  评论(0编辑  收藏