【DataBase】MySQL 13 分组查询
视频参考自:P59 - P68
https://www.bilibili.com/video/BV1xW411u7ax
分组查询 GROUP BY
-- group by 子句
-- 要注意!group by 子句一定是放在WHERE的后面
/*
SELECT 分组函数,列(要求出现在GROUP BY后面)
FROM 表
[WHERE 筛选条件]
GROUP BY 分组列表
[ORDER BY 子句] 查询列表必须特殊,要求是分组函数和GROUP BY后出现的
*/
查询每个部门的平均工资
单使用AVG函数只能查询所有部门一起的平均工资
-- 查询每个部门的平均工资:
SELECT AVG(`salary`)
FROM `employees`;
引入GROUP BY子句 ,对部门进行一个分组
SELECT AVG(`salary`),`department_id`
FROM `employees`
GROUP BY `department_id`;
查询每个工种的最高工资
# 查询每个工种的最高工资,
SELECT MAX(`salary`),`job_id`
FROM `employees`
GROUP BY `job_id`;
可以发现,使用GROUP BY子句的前提条件是必须要有聚合函数【组合函数】的查询使用
它们和分组查询形成了一种依赖关系,二者缺一不可
添加分组前,筛选条件
# 前置加入筛选条件
-- 查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(`salary`),`department_id`
FROM `employees`
WHERE `email` LIKE '%a%'
GROUP BY `department_id`; # 查询有奖金的每个人领导手下员工的最高工资
SELECT MAX(`salary`),`manager_id`
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `manager_id`;
添加复杂的筛选条件
【需要对分组后的结果再执行筛选 使用Having】
# 复杂筛选条件
# 案例 查询哪些部门的员工个数大于2
SELECT COUNT(*) as 'counts',`department_id`
FROM `employees`
group by `department_id`
Having counts > 2; -- 对分组之后再进行筛选的,使用Having子句充当where # 查询每个工种有奖金的员工的最高工资 > 12000 的工种编号,和最高工资
SELECT MAX(`salary`) 'maxSalary',`job_id`
FROM `employees`
where `commission_pct` IS NOT NULL
GROUP BY `job_id`
having maxSalary > 12000 ; # 查询每个领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及最低工资
SELECT MIN(`salary`),`manager_id`
FROM `employees`
WHERE `manager_id` > 102
GROUP by `manager_id`
having MIN(`salary`) > 5000;
按表达式进行分组
要注意一点:Oracle是不支持GROUP BY & HAVING SQL语句的
-- 按员工姓名的长度分组,查询每一组员工个数,筛选员工个数大于5的 -- 先查询每个长度的员工个数
SELECT COUNT('员工个数'),LENGTH(`last_name`) AS "名字长度分组"
FROM `employees`
GROUP BY LENGTH(`last_name`); -- 再筛选大于5的个数
SELECT COUNT('员工个数') AS 'c',LENGTH(`last_name`) AS "名字长度分组"
FROM `employees`
GROUP BY LENGTH(`last_name`)
HAVING c > 5;
按多个字段分组查询
-- 查询每个部门的每个工种的员工的平均工资 -- 先确定要查询的要素
SELECT AVG(`salary`),`job_id`,`department_id`
-- 查询的要素来自于哪张表
FROM `employees`
-- 对查询的条件进行判断
GROUP BY `job_id`,`department_id`;
分组查询是支持排序的
-- 查询每个部门的每个工种的员工的平均工资,按平均工资从高到底显示
SELECT AVG(`salary`),`job_id`,`department_id`
FROM `employees`
GROUP BY `job_id`,`department_id`
ORDER BY AVG(`salary`) DESC; -- 增加部门ID不是null的情况
SELECT AVG(`salary`),`job_id`,`department_id`
FROM `employees`
WHERE `department_id` IS NOT NULL
GROUP BY `job_id`,`department_id`
ORDER BY AVG(`salary`) DESC; -- 平均工资还要高于10000的
SELECT AVG(`salary`),`job_id`,`department_id`
FROM `employees`
WHERE `department_id` IS NOT NULL
GROUP BY `job_id`,`department_id`
HAVING AVG(`salary`) > 10000 -- 要放在排序的前面,排序留在最后面执行
ORDER BY AVG(`salary`) DESC;
GROUP BY的总结:
- 分组前筛选
数据源是 原始表【就是从数据库查询的表】
在GROUP BY 之前 使用【WHERE】子句
- 分组后筛选
数据源是 虚拟表【就是从分组之后返回的结果集】
在GROUP BY 之后 使用【HAVING】子句
- 支持多字段分组查询
多字段使用逗号隔开
字段没有顺序要求
- 支持表达式 & 函数
- 支持排序查询
排序子句放在SQL的结尾
练习案例:
-- 1、查询个工种ID的员工工资的聚合函数,并按照工种升序
SELECT `job_id`,MAX(`salary`),MIN(`salary`),AVG(`salary`),SUM(`salary`)
FROM `employees`
GROUP BY `job_id`
ORDER BY `job_id` ASC; -- 2查询 员工工资最高最低的差距
SELECT MAX(`salary`),MIN(`salary`),MAX(`salary`) - MIN(`salary`) '相差金额'
FROM `employees`; -- 3查询各个管理者手下员工的最低工资,不得低于6000,没有管理者不计算在内 -- 歧义SQL 不正确的筛选>6000
SELECT `manager_id`,MIN(`salary`)
FROM `employees`
WHERE `salary` > 6000 AND `manager_id` IS NOT NULL -- 在分组之前筛选6000
GROUP BY `manager_id`; -- 正确SQL
SELECT `manager_id`,MIN(`salary`)
FROM `employees`
WHERE `manager_id` IS NOT NULL -- 在分组之前筛选6000无效
GROUP BY `manager_id`
HAVING MIN(`salary`) > 6000; -- 4 查询所有部门编号,员工数量,和工资平均值,按工资平均值降序
SELECT AVG(`salary`),COUNT('员工数量'),`department_id`
FROM `employees`
GROUP BY `department_id`
ORDER BY AVG(`salary`) ASC; -- 如果没有部门就不算在内的话...
SELECT AVG(`salary`),COUNT('员工数量'),`department_id`
FROM `employees`
WHERE `department_id` IS NOT NULL
GROUP BY `department_id`
ORDER BY AVG(`salary`) ASC; -- 5 查询每个具有工种ID的员工人数
SELECT `job_id`,COUNT('人数')
FROM `employees`
GROUP BY `job_id`;
【DataBase】MySQL 13 分组查询的更多相关文章
- MySQL时间分组查询
表TESTER 字段:id -- INT date -- TIMESTAMP 1.如何按年.月.日分组查询? select DATE_FORMAT(date,'%Y-%m-%d') time, ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)
一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...
- Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...
- MySQL全面瓦解10:分组查询和聚合函数
概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位):或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估). ...
- mysql 分组查询问题 group_concat
这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...
- Mysql按时间段分组查询来统计会员的个数
1.使用case when方法(不建议使用)- 代码如下 复制代码 SELECT COUNT(DISTINCT user_id) user_count, CASE WHEN cre ...
- Mysql按时间段分组查询
Mysql按时间段分组查询来统计会员的个数,mysql个数 Mysql按时间段分组查询来统计会员的个数,mysql个数 1.使用case when方法(不建议使用)- 代码如下 复制代码SELECT ...
- Oracle和MySQL分组查询GROUP BY
Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...
- MySQL分组查询与连接查询
一,分组查询 使用ORDER BY子句将表中的数据分成若干组(还是按行显示) 语法: SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORD ...
随机推荐
- 认识mongodb
Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自 ...
- spring.jackson 相差8小时,restful接收Date参数处理
spring.jackson 相差8小时,restful接收Date参数处理 前端提交字符串到后台映射日期类型的话,加上@DateTimeFormat(pattern = "yyyy-M ...
- QQ、支付宝、微信收款码三合一
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` QQ.支付宝.微信收款码三合一 日期:2018-8-24 ...
- DPO: Direct Preference Optimization 直接偏好优化(学习笔记)
学习参考:链接1 一.为什么要提出DPO 在之前,我们已经了解到基于人类反馈的强化学习RLHF分为三个阶段:全监督微调(SFT).奖励模型(RM).强化学习(PPO).但是RLHF面临缺陷:RLH ...
- 半夜被慢查询告警吵醒,limit深度分页的坑
分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 梅雨季,闷热的夜,令人窒息,窗外一道道闪电划破漆黑的夜幕,小猫塞着耳机听着恐怖小说,辗转反侧,终于睡意来了,然 ...
- QT学习:10 IO类
--- title: framework-cpp-qt-10-IO类 EntryName: framework-cpp-qt-10-QIODevice date: 2020-04-17 10:24:0 ...
- OpenFOAM v2306 安装
参考 https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/debian curl https://dl.open ...
- k8s学习总结之各组件功能及作用的详细介绍
K8S集群架构: 一个K8S集群是由两大部分组成: Master节点和Node节点 一.Master节点主要包括API Server.Scheduler.Controller manager.etcd ...
- 张高兴的 MicroPython 入门指南:(二)GPIO 的使用
目录 什么是 GPIO 使用方法 使用微动开关点亮板载 LED 硬件需求 电路 代码 参考 什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即&quo ...
- Filter拦截器从入门到快速上手与Listener监听器概述
前置内容: 会话跟踪技术 目录 1. 过滤器Filter 1.1 Filter快速入门 1.2 Filter执行流程 1.3 Filter使用细节 1.4 案例 2. 监听器Listener概述 2. ...