[TOC]
### GROUP 分组查询
>[danger] 分组查询,顾名思义就是按照组区分开,进行查询,比如按照性别分组
> 注意!!! group by 后面分组的字段不能随便加,比如 group by 'sex' 那么,查询字段必须为 sex
### 按照性别分组查询全部数学成绩的平均分
~~~
const { Sequelize } = app;
// 按照性别分组查询全班数学成绩的平均分
const ret = await Student.findAll({
// 查询字段要和分组字段一致!!!!
attributes:['sex', [ Sequelize.fn('AVG', Sequelize.col('math')), 'math_avg' ] ],
// 分组字段
group: ['sex']
})
SELECT `sex`, AVG(`math`) FROM `student` GROUP BY `sex`;
[
{
"sex": "女",
"math_avg": "85.4286"
},
{
"sex": "男",
"math_avg": "78.0000"
}
]
~~~
*****
### 按照性别分组,分别查询全班同学数学成绩平均分和总人数
~~~
// 按照性别分组,分别查询全班同学数学成绩平均分和总人数
const ret = await Student.findAll( {
attributes:[
'sex',
[Sequelize.fn('AVG', Sequelize.col('math')), 'match_avg'],
[Sequelize.fn('COUNT', Sequelize.col('id')), 'total_student']
],
group: ['sex']
} )
SELECT `sex`, AVG(`math`) , COUNT(`id`) FROM `student` GROUP BY `sex`;
[
{
"sex": "女",
"match_avg": "85.4286",
"total_student": 7
},
{
"sex": "男",
"match_avg": "78.0000",
"total_student": 5
}
]
~~~
*****
### 按照地区分组,分别统计每个地区数学成绩平均分 和 总人数,分数低于70分的同学不参与分组
~~~
// 按照地区分组,分别统计每个地区数学成绩平均分 和 总人数,分数低于70分的同学不参与分组
const ret = await Student.findAll( {
attributes:[
'address',
[ Sequelize.fn('AVG', Sequelize.col('math')), 'math_avg' ],
[ Sequelize.fn('COUNT', Sequelize.col('id')), 'total_student' ]
],
where: {
math: {
[Op.gt]:70
}
},
group: ['address']
} )
SELECT `address`, AVG(`math`) , COUNT(`id`) FROM `student` WHERE `math` > 70 GROUP BY `address`;
[
{
"address": "四川",
"math_avg": "84.0000",
"total_student": 2
},
{
"address": "昆明",
"math_avg": "90.0000",
"total_student": 1
},
{
"address": "潭州",
"math_avg": "92.0000",
"total_student": 1
},
{
"address": "西凉",
"math_avg": "82.0000",
"total_student": 2
},
{
"address": "贵州",
"math_avg": "86.2500",
"total_student": 4
}
]
~~~
*****
### 按照地区分组,分别统计每个地区学生的数学平均分,分数低于70分的同学不参与分组,并且参与分组的人数不能少于2人
>[danger] 注意!!!where 和 having 的区别?
> where 在分组之前进行限定,如果不满足条件,则不参与分组
> having 在分组之后进行限定,如果不满足结果,则不会被查询出来
> where 后不可以带上聚合函数判断,having 后可以带上聚合函数进行判断
~~~
await Student.findAll( {
attributes:[
'address',
[Sequelize.fn('AVG', Sequelize.col('math')), 'math'],
[Sequelize.fn('COUNT', Sequelize.col('id')), 'total']
],
where: {
math: {
[Op.gt]:70
}
},
group: 'address',
having: {
total:{
[Op.gt]:2
}
}
})
SELECT `address`, AVG(`math`),COUNT(`id`) as total FROM `student`
WHERE `student` > 70
GROUP BY `address`
HAVING `total` > 2;
~~~
- 概述
- 起步
- 跨域配置
- 路径别名
- 路由
- api版本控制
- 错误和异常
- 全局异常处理
- 数据库
- 创建迁移文件
- sequelize数据类型
- 配置
- 新增
- 查询
- 条件查询
- 模糊查询
- 排序查询
- 聚合查询
- 分组查询
- 分页查询
- 修改
- 删除
- 获取器
- 修改器
- 静态属性
- 字段验证
- 外键约束
- 关联模型
- 一对一
- 一对多
- 左外连接
- 多对多
- 字段显示隐藏
- 事务
- 字段自增
- 验证层
- egg-validate
- indicative验证器
- egg-validate-plus
- betterValidate
- 校验规则
- 中间件
- 安全
- 数据加密
- 单向加密
- 示例代码
- 封装egg加密
- 上传
- path模块
- 单文件上传
- 多文件上传
- 按照日期存储
- 工具函数
- egg常用工具函数
- 缓存
- 配置缓存插件
- 设置缓存
- 获取缓存
- 删除缓存
- 消息队列
- rabbitMQ
- 安装
- 简单队列
- 工作队列
- 工作队列(dispach分发)
- 消息应答和持久化
- redis
- 数据类型
- 字符串类型(String)
- 哈希类型(Hash)
- 列表(List)
- 无序集合(Set)
- 可排序集合(Zset)
- 邮件系统
- nodeMailer
- 第三方模块
- 生成随机数
- JWT
- JWT鉴权
- 生成Token
- 短信服务
- 阿里大鱼短信验证码
- 发送短信逻辑
- 阿里短信Node类