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 ;
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号