Mysql数据库基础第二章:(五)分组查询

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)



一、基本语法

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 ;

posted @ 2022-08-27 11:09  JOJO数据科学  阅读(39)  评论(0编辑  收藏  举报