视频参考自: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 分组查询的更多相关文章

  1. MySQL时间分组查询

    表TESTER 字段:id -- INT    date  -- TIMESTAMP 1.如何按年.月.日分组查询? select DATE_FORMAT(date,'%Y-%m-%d') time, ...

  2. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  3. mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)

    一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...

  4. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

  5. MySQL全面瓦解10:分组查询和聚合函数

    概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位):或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估). ...

  6. mysql 分组查询问题 group_concat

    这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...

  7. Mysql按时间段分组查询来统计会员的个数

    1.使用case when方法(不建议使用)-  代码如下 复制代码 SELECT    COUNT(DISTINCT user_id) user_count,    CASE    WHEN cre ...

  8. Mysql按时间段分组查询

    Mysql按时间段分组查询来统计会员的个数,mysql个数 Mysql按时间段分组查询来统计会员的个数,mysql个数 1.使用case when方法(不建议使用)- 代码如下 复制代码SELECT ...

  9. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...

  10. MySQL分组查询与连接查询

    一,分组查询 使用ORDER BY子句将表中的数据分成若干组(还是按行显示) 语法: SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORD ...

随机推荐

  1. C# .NET Unix 时间戳

    10 位时间戳: public static long GetTimeStampTen() { return (DateTime.Now.ToUniversalTime().Ticks - 62135 ...

  2. Vue微前端架构与Qiankun实践理论指南

    title: Vue微前端架构与Qiankun实践理论指南 date: 2024/6/15 updated: 2024/6/15 author: cmdragon excerpt: 这篇文章介绍了微前 ...

  3. php des加密用java解析不了 改个模式 加个IV php密钥/IV要求都是8位

    php des加密用java解析不了 改个模式 加个IV  php密钥/IV要求都是8位 php des加密用java解析不了 Wrong IV length: must be 8 bytes lon ...

  4. SQL索引优化,菜单列表优化

    SQL索引优化,菜单列表优化 现象:在系统中几个数据量大的列表页面,首次进入页面未增加筛选条件,导致进入的列表查询速度非常慢.分析:通过SQL查看,是做了count求和查询,然后根据总的记录数来做分页 ...

  5. BST-Treap名次树数组&指针实现板子 Ver1.0

    这里只有板子没有原理QWQ 可实现 1.插入 x 数 2.删除 x 数(若有多个相同的数,只删除一个) 3.查询 x 数的排名(排名定义为比当前数小的数的个数 +1) 4.查询排名为 x 的数 5.求 ...

  6. 什么是spring,它能够做什么?

    1.什么是SpringSpring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情. ...

  7. 基于.NET Core + Jquery实现文件断点分片上传

    基于.NET Core + Jquery实现文件断点分片上传 前言 该项目是基于.NET Core 和 Jquery实现的文件分片上传,没有经过测试,因为博主没有那么大的文件去测试,目前上传2G左右的 ...

  8. Ubuntu 18.04安装xdrp以使用远程桌面

    背景 开发环境有一台服务器默认没有屏幕(被我拿走用来拓展屏幕了),有时候需要使用到界面但嫌弃拆显示器太麻烦,因此使用远程桌面来解决这个需求. 做法 安装xrdp sudo apt install -y ...

  9. STM32 学习:IAP有关介绍

    --- title: mcu-stm32-IAP-0-about date: 2020-05-27 08:51:58 categories: tags: - iap - stm32 - about - ...

  10. Linux Redis 服务设置开机自启动

    @ 目录 前言 一.准备工作 二.操作步骤 2.1 修改redis.conf文件 2.2 创建启动脚本 2.3 设置redis 脚本权限 2.4 设置开机启动 2.5 验证 总结 前言 请各大网友尊重 ...