简介
本系列(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;