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

简介

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

说明

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

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

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

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

目录

MySQL学习笔记1:数据查询语言(DQL语言)select基本用法
MySQL学习笔记2:where 条件查询
MySQL学习笔记3:order by 排序查询
MySQL学习笔记4:常见函数(一) 单行函数
MySQL学习笔记5:常见函数(二) 分组函数
MySQL学习笔记6:group by 分组查询
MySQL学习笔记7:join 连接查询(SQL 92标准)
MySQL学习笔记8:join 连接查询(SQL 99标准)
MySQL学习笔记9:子查询(内查询)
MySQL学习笔记10:union 联合查询
MySQL学习笔记11:limit 分页查询
MySQL学习笔记12:数据操纵语言(DML语言)insert update delete
MySQL学习笔记13:数据定义语言(DDL语言)create alter drop
MySQL学习笔记14:常见数据类型
MySQL学习笔记15:常见约束
MySQL学习笔记16:事务控制语言(TCL语言)
MySQL学习笔记17:视图
MySQL学习笔记18:存储过程
MySQL学习笔记19:函数
MySQL学习笔记20:流程控制结构

分组查询

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值