MySQL学习笔记6:group by 分组查询

简介

本系列(MySQL学习笔记)是我基于B站上很是受欢迎的MySQL 基础+高级篇- 数据库 -sql -尚硅谷视频所作的笔记,方便你们学习和掌握MySQL。mysql

说明

1.这个系列基本包含了视频中老师讲课的全部内容,包括知识点、案例、部分测试题。
2.所需的配套资料(来自B站评论区)web

@黎曼的猜测:
配套资料下载–>公众号公众号 DragonWell 回复:mysql 注意:是公众号!!是公众号!!是公众号,点那个 搜一搜 搜索!!!
不是私人号,是公众号!!! (能够直接在 搜一搜 搜索 dragonwell) 名称是:DragonWell公众号sql

3.SQLyog的安装(来自B站评论区)数据库

@江左萌粽猪 连接:https://pan.baidu.com/s/18PDjbqEeDSAjQM0VQye6og 提取码:qjuzide

目录

MySQL学习笔记1:select查询(一) 基本用法
MySQL学习笔记2:select查询(二) 条件查询
MySQL学习笔记3:select查询(三) 排序查询
MySQL学习笔记4:常见函数(一) 单行函数
MySQL学习笔记5:常见函数(二) 分组函数
MySQL学习笔记6:group by 分组查询
MySQL学习笔记7:join链接查询(SQL 92标准)svg

分组查询

group by子句将表中的数据分红若干组

语法
select 分组函数,列(要求出如今group by的后面) 
from 表名 
【where 筛选条件】
group by 分组列表 
【order by 子句】

注意 :
查询列表比较特殊,要求是分组函数和group by 后出现的字段

特色:
1,分组查询中的筛选条件能够分为两类
            数据源       关键字    位置
分组前筛选  原始表        where   group by 前面
分组后筛选 分组后的结果  having  group by 后面
①分组函数作条件确定放在having子句中
②能用分组前筛选的,优先考虑分组前筛选
2.group by子句支持单个字段分组,多个字段分组(,隔开,无顺序要求),表达式函数
3.能够添加排序(排序放在整个分组查询的最后)
查询每一个部门的平均工资
SELECT AVG(salary),department_id FROM employees GROUP BY department_id;
查询每一个工种的最高工资
SELECT MAX(salary), job_id FROM employees GROUP BY job_id;
查询每一个位置上的部门个数
SELECT COUNT(*),location_id FROM departments GROUP BY location_id;

添加筛选条件

查询邮箱中包含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;

添加复杂的筛选条件

查询哪一个部门的员工个数大于2
# ①查询每一个部门的员工个数
# ②根据1的结果筛选,查询

SELECT COUNT(*) ,department_id
FROM employees 
GROUP BY department_id
HAVING COUNT(*) > 2; # ②分组后的筛选,这个结果在原始表里没有的,用having

查询【每一个工种】【有奖金的员工】的【最高工资>12000】的【工种编号】和【最高工资】
# 【有奖金的员工】是员工表(原始表)里就有的,用where
# 【每一个工种的最高工资>12000】是员工表(原始表)里没有的,用having 
SELECT MAX(salary),job_id 
FROM employees 
WHERE commission_pct IS NOT NULL
GROUP BY job_id 
HAVING MAX(salary) > 12000;

查询【领导编号大于102】的【每一个领导】手下的【最低工资大于5000】的【领导编号】是哪一个,以及【其最低工资】
# 【领导编号大于102】 where
# 【最低工资大于5000】 having
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;

按表达式或函数分组

按【员工姓名长度】分组,查询【每一组员工个数】,筛选【员工个数大于5】 的有哪些
SELECT COUNT(*),LENGTH(last_name) 
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5; # 能够用别名

按多个字段分组

查询每一个部门每一个工种的员工平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id ;# 能够颠倒

添加排序

查询每一个部门每一个工种的员工平均工资,按平均工资高低排序
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC;

测试题

查询各job_id 员工工资的最大值最小值平均值总和,并按job_id 升序
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary),job_id 
FROM employees
GROUP BY job_id
ORDER BY job_id;

查询员工最高工资和最低工资的差距
SELECT MAX(salary)-MIN(salary) 
FROM employees;

查询全部部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT department_id,COUNT(*),AVG(salary) 
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC;

选择具备各个job_id的员工人数
SELECT COUNT(*) ,job_id
FROM employees
GROUP BY job_id;