分组聚集计算与分组过滤


分组

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            |
+----------------+

转载于:https://www.cnblogs.com/velscode/p/10557115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值