视频参考自: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. k8s——搭建集群环境

    服务器要求(三台都要操作) 一台master两台node 能连外网 关闭防火墙 关闭selinux 设置主机名,域名解析 关闭swap(记得关完之后重启) swapoff -a //临时关闭 vim ...

  2. pandas基础--汇总和计算描述统计

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  3. Symbol.for()

    当我们在不同的模块或文件中需要共享一个特定的Symbol时,可以使用Symbol.for()方法来实现. 假设我们有两个模块,分别是module1.js和module2.js.我们希望在这两个模块中使 ...

  4. 关于前三次pta的总结

    前言 这三次pta难度在不断上升的同时,要求我们线上慕课+自主学习来了解更多的java中的各种方法,如:正则表达式 List Map等.与此同时要求我们展开尝试并熟练类的构造,类的引用,链表的基本运用 ...

  5. 简单易懂的JSON框架

      分享一个由本人编写的JSON框架.   JSON反序列化使用递归方式来解析JSON字符串,不使用任何第三方JAR包,只使用JAVA的反射来创建对象(必须要有无参构造器),赋值,编写反射缓存来提升性 ...

  6. 解决 Error running ‘Application‘: Command line is too long.

    一.项目场景:运行刚拉取下来的项目代码,出现下面问题描述的错误提示. 二.问题描述Error running 'Application': Command line is too long. Shor ...

  7. OAuth + Security - 错误收集

    Could not decode JSON for additional information: BaseClientDetails 完整的错误输出如下: 2019-12-03 22:18:37.2 ...

  8. windows powershell 解压 .gz文件

    windows 10下解压.gz后缀文件 打开windows powershell界面,(1)输入cd desktop(文件的存储位置,示例为存储在电脑桌面上), (2)输入tar -zxvf 需要解 ...

  9. 汽车生产车间PMC组态画面应该怎么设计

    通常我们所说的汽车制造四大工艺指的是:冲压.焊装.涂装.总装.一般来说,在汽车制造工厂,这四大工艺分别对应四大车间.本文结合一些实际应用案例,向大家展示一下 TopStack 在汽车制造业各工艺车间中 ...

  10. RHEL8.1---离线升级gcc

    升级gcc到gcc9.1.0 下载离线包.放到/opt下 [root@172-18-251-35 opt]# wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc ...