MySQL学习笔记 ------ 分组查询

#进阶5:分组查询

/*

语法:

select 分组函数,列(要求出现在group by的后面)

from 表

【where 筛选条件】

group by 分组的列表

【order by 排序的字段】;

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

特点:

1、和分组函数一同查询的字段必须是group by后出现的字段

2、筛选分为两类:分组前筛选和分组后筛选

针对的表 位置 连接的关键字

分组前筛选 原始表 group by where在group by前

分组后筛选 group by后的结果集 group by后 having在group by后

注意:分组函数做条件肯定是放在having子句中,能用分组前筛选的,优先考虑用分组前筛选

问题1:分组函数做筛选能不能放在where后面

答:不能

问题2:where------group by------having

一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率

3、分组可以按单个字段也可以按多个字段,多个字段之间用逗号分隔且不分顺序

4、可以搭配着排序使用

*/

#引入:查询每个部门的员工个数

SELECT COUNT(*) FROM employees WHERE department_id=90;

#1.简单的分组

#案例1:查询每个工种的员工平均工资

SELECT AVG(salary),job_id

FROM employees

GROUP BY job_id;

#案例2:查询每个位置的部门个数

SELECT COUNT(*),location_id

FROM departments

GROUP BY location_id;

#案例3:查询每个工种的员工最大工资

SELECT MAX(salary),job_id

FROM employees

GROUP BY job_id;

#2、可以实现分组前的筛选

#案例1:查询邮箱中包含a字符的 每个部门的最高工资

SELECT MAX(salary),department_id

FROM employees

WHERE email LIKE '%a%'

GROUP BY department_id;

#案例2:查询有奖金的每个领导手下员工的平均工资

SELECT AVG(salary),manager_id

FROM employees

WHERE commission_pct IS NOT NULL

GROUP BY manager_id;

#3、分组后筛选

#添加简单筛选条件

#案例:查询哪个部门的员工个数>5

#(1)查询每个部门的员工个数

SELECT COUNT(*),department_id

FROM employees

GROUP BY department_id

#(2)根据(1)的结果进行筛选,查询哪个部门的员工个数>2

SELECT COUNT(*),department_id

FROM employees

GROUP BY department_id

HAVING COUNT(*)>2;#having用于分组后的筛选,where用于分组前对原始表的筛选

#添加复杂筛选条件,条件过于复杂时可以拆分开进行

#注意:在原表中有的用where筛选如:有奖金,在原表中没有的用having筛选如:最高工资>12000

#案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

SELECT MAX(salary),job_id

FROM employees

WHERE commission_pct IS NOT NULL

GROUP BY job_id

HAVING MAX(salary)>12000;

#案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资

SELECT MIN(salary),manager_id

FROM employees

WHERE manager_id>102

GROUP BY manager_id

HAVING MIN(salary)>5000;

#4.添加排序

#案例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序

SELECT job_id,MAX(salary) m

FROM employees

WHERE commission_pct IS NOT NULL

GROUP BY job_id

HAVING m>6000

ORDER BY m ;

#5.按多个字段分组

#案例:查询每个工种每个部门的最低工资,并按最低工资降序

SELECT MIN(salary),job_id,department_id

FROM employees

GROUP BY department_id,job_id

ORDER BY MIN(salary) DESC;

#6.按表达式或函数分组

#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些

SELECT COUNT(*),LENGTH(last_name)

FROM employees

GROUP BY LENGTH(last_name)

HAVING COUNT(*)>5;

#可以使用别名

SELECT COUNT(*) c,LENGTH(last_name) la_name

FROM employees

GROUP BY la_name

HAVING c>5;

#------分组查询总结------#

一、语法

SELECT 分组函数,分组后的字段

FROM 表

【WHERE 筛选条件】

GROUP BY 分组的字段

【HAVING 分组后的筛选】

【ORDER BY 排序列表】

二、特点

使用关键字 筛选的表 位置

分组前筛选 WHERE 原始表 GROUP BY的前面

分组后筛选 HAVING 分组后的结果 GROUP BY 的后面

相关推荐
岁忧2 小时前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
小欣加油2 小时前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
Wy_编程3 小时前
Linux-文本搜索工具grep
linux·运维·服务器
xujiangyan_3 小时前
linux的sysctl系统以及systemd系统。
linux·服务器·网络
Lovyk3 小时前
Linux Shell 常用操作与脚本示例详解
linux·运维·服务器
不羁。。3 小时前
【撸靶笔记】第八关:GET - Blind - Boolian Based - Single Quotes
数据库·sql·mybatis
AwhiteV4 小时前
利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
数据库·人工智能·自然语言处理·oracle·大模型·text2sql
m0_595199854 小时前
Redis(以Django为例,含具体操作步骤)
数据库·redis·缓存
爱尚你19934 小时前
MySQL 三大日志:redo log、undo log、binlog 详解
数据库·mysql
ReedFoley4 小时前
【笔记】动手学Ollama 第五章 Ollama 在 LangChain 中的使用 - Python 集成
笔记·langchain