Mysql数据库基础系列
软件下载地址
提取码:7v7u
数据下载地址
提取码:e6p9
mysql数据库基础第一章:(一)数据库基本概念
mysql数据库基础第一章:(二)mysql环境搭建
mysql数据库基础第二章:(一)基础查询
mysql数据库基础第二章:(二)条件查询
mysql数据库基础第二章:(三)排序查询
mysql数据库基础第二章:(四)常见函数
mysql数据库基础第二章:(五)分组查询
mysql数据库基础第二章:(六)连接查询
mysql数据库基础第二章:(七)子查询
mysql数据库基础第二章:(八)子查询经典案例
mysql数据库基础第二章:(九)分页查询
mysql数据库基础第二章:(十)连接查询
mysql数据库基础第三章:DML语言
mysql数据库基础第四章:DDL(数据定义语言):库表的管理、数据类型与约束条件
mysql数据库基础第五章:(一)事务
mysql数据库基础第五章:(二)视图
mysql数据库基础第六章:变量、存储过程与函数
mysql数据库基础第七章:流程控制结构
mysql数据库基础第八章:窗口函数和公用表达式(CTE)
@TOC
一、基本语法
select column, group_function(column)
from table
[where condition]
[group by group_by_expression]
[order by column];
[]:表示可省略
在做筛选条件时,如果是在分组前删选,则用where如果是在分组后筛选,则用having。
二、案例
2.1简单的分组查询
# 1.查询每个工种的最高工资
SELECT
MAX(salary),
job_id
FROM
employees
GROUP BY job_id ;
# 2.查询每个位置上的部门个数
SELECT COUNT(*), location_id
FROM departments
GROUP BY department_id;
2.2 添加筛选条件的分组查询(分组前)
简单的添加删选条件使用在分组前使用where,具体如下
#1.查询邮箱中包含a字符的每个部门的平均工资
SELECT
AVG(salary)
FROM
employees
WHERE email LIKE '%a%'
GROUP BY department_id ;
# 2. 查询有奖金的每个领导手下员工的最高工资
SELECT
MAX(salary),
manager_id
FROM
employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id ;
2.3 分组后的删选条件
分组后的删选条件使用having
# 1.查询哪个部门的员工个数>2
SELECT
COUNT(*),
department_id
FROM
employees
GROUP BY department_id
HAVING COUNT(*) > 2 ;
#2.查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT
MAX(salary),
job_id
FROM
employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary) > 12000 ;
2.4按表达式分组
# 按员工姓名的长度分组,查询每一组的员工个数,删选员工个数>5的
SELECT
COUNT(*),
LENGTH(last_name)
FROM
employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*) > 5 ;
2.5 按多个字段排序
# 查询每个部门每个工种员工的平均工资
SELECT AVG(salary), department_id, job_id
FROM employees
GROUP BY department_id,job_id;
2.6 添加排序
# 查询每个部门每个工种员工的平均工资,按平均工资降序排序
SELECT
AVG(salary),
department_id,
job_id
FROM
employees
GROUP BY department_id,
job_id
ORDER BY AVG(salary) DESC ;
总结:如果删选条件在分组前,使用where关键字,
如果删选条件在分组后,使用haing关键字
分组函数做条件直接放在having子句中。
三、练习
###1.查询各 job_id 的员工工资的最大值,最小值,平均值,总和,并按 job_id 升序
SELECT
job_id,
MAX(salary),
MIN(salary),
AVG(salary),
SUM(salary)
FROM
employees
GROUP BY job_id
ORDER BY job_id ASC ;
#2. 查询员工最高工资和最低工资的差距(DIFFERENCE)
SELECT
MAX(salary) - MIN(salary)
FROM
employees ;
#3. 查询各个管理者手下员工的最低工资,其中最低工资不能低于 6000, 没有管理者的员工不计算在内
SELECT
manager_id,
MIN(salary)
FROM
employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary) >= 6000 ;
#4. 查询每个部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT
department_id,
COUNT(*),
AVG(salary)
FROM
employees
GROUP BY department_id
ORDER BY AVG(salary) DESC ;
#5. 选择具有各个 job_id 的员工人数
SELECT
COUNT(*),
job_id
FROM
employees
GROUP BY job_id ;