【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 ...
随机推荐
- ssh 端口转发实验
为什么会使用端口转发 端口转发的优点: 安全性:通过隐藏实际服务(在这种情况下是监听在22端口的SSH服务)的真实端口号,增加了一层安全性.攻击者可能不知道真正的服务端口号,因此更难进行有针对性的攻击 ...
- Github Fork仓库的冲突与同步管理
在使用Github进行协作开发时,fork一个仓库并在本地进行开发是常见的工作流程.然而,当源仓库(上游仓库)有了更新时,如何同步这些更新并解决可能的合并冲突是一个关键问题.本文将详细介绍如何管理这些 ...
- Dva.js 快速上手指南
先说些废话 最近在开发React技术栈的项目产品,对于数据状态的管理使用了Dva.js,作为一个资深的ow玩家,我看到这个名字第一反应就是----这不是ow里的一个女英雄吗?仔细阅读了官方文档之后,发 ...
- vue带有参数的路由跳转 动态路由
先定义好路由在router文件下面创建一个新的文件夹里面写上自己定义的路由 export default { path: '/detail/:id', component: () => ...
- C#.NET AES CBC 加密
重点: 1. KEY 和 IV 转 byte[] 时的编码. 2.要加密的字符串转 byte[] 时的编码. 3.AES 的PADDING,MODE. 4.加密后的byte[] 转字符串时的编码. 先 ...
- EF,lambda 反向模糊查询
SELECT * FROM table as t WHERE "张三的偶像" LIKE t.userName; bool thisMchBelong = _mch_blackSer ...
- 可观测性平台夜莺开源项目发布V6正式版!
夜莺开源项目在2023.7月底发布了V6版本,这个版本开始,项目目标不止于做一款开源监控系统,而是要做一款开源可观测性平台,不过路漫漫其修远兮,初期只是把日志数据源引入并完成了基本的可视化,后续会着力 ...
- Spring源码——@Component,@Service是如何被解析?
引言 在Spring中,Component.Service是在工作中经常被使用到的注解,为了加深对Spring运行机制的理解,今天我们一起来看一下Spring中对Component等注解的处理方式 C ...
- 详解Kubernetes Pod优雅退出
1.概述 Pod优雅关闭是指在Kubernetes中,当Pod因为某种原因(如版本更新.资源不足.故障等)需要被终止时,Kubernetes不会立即强制关闭Pod,而是首先尝试以一种"优雅& ...
- Nginx SSL证书更新及密码套件更新
一.域名更换证书 ssl证书一般包括证书文件crt.cer.pem.pfx和私钥文件key. CER.CRT.PEM 和 PFX 是不同的证书文件格式,它们之间存在一些区别: CER (DER 编码) ...