【MySQL】MySQL基础07— SQL学习 — DQL — 分组查询(转载请注明出处)

SQL学习 — DQL — 分组查询

5. 分组查询
  • 背景:在分组函数的内容中,我们提及和分组函数一起查询的字段会有限制,产生错误。因为分组函数是将所以的参数统计成一个结果,而查询的字段是返回符合条件的个数,那么就会出错。所以引入了分组查询,将表中的相同的内容切分成数块,然后分别进行统计后返回结果,这样就不会单纯返回一个结果。

    # 分组查询
    /*
    工具:可以使用group by子句将表中的数据分成若干组
    
    语法:
    select  分组函数, 字段(要求出现在group by的后面)
    from 表名
    [where 筛选条件]
    [group by 分组的字段]
    [having 筛选条件]
    [order by 子句]
    
    注意:
    1.查询列表比较特殊,要求得是分组函数和出现在group by后的分组字段
    
    特点:
    1.分组查询中的筛选条件分为两类:
    			数据源	关键字	位置
    	分组前筛选	原始表	where	group by子句前
    	分组后筛选	分组表	having	group by子句后
    	结论:1.分组函数做条件肯定是放在having子句中
    	      2.能用分组前筛选的,就优先考虑使用分组前筛选,提高性能
    	      
    	      
    2.group by子句支持单个字段分组,多个字段分组(多个字段分组没有顺序要求),表达式,函数
    
    3.也可以添加排序,放在整个查询的最后
    
    */
    
  • 简单的分组查询:分组前的筛选用where

    # 简单的分组查询:分组前的筛选用where
    # 案例1:查询每个部门的平均工资
    SELECT AVG(salary), department_id
    FROM employees
    GROUP BY department_id;
    
    
    # 案例2:查询每个工种的最高工资
    SELECT MAX(salary), job_id
    FROM employees
    GROUP BY job_id;
    
    # 案例3:查询每个位置上的部门个数
    SELECT COUNT(*), location_id
    FROM departments
    GROUP BY location_id; 
    
    
    # 案例4:查询邮箱中包含a字符,每个部门的平均工资
    SELECT AVG(salary), email, department_id
    FROM employees
    WHERE email LIKE '%a%'
    GROUP BY department_id;
    
    
    # 案例5:查询有奖金的每个领导手下员工的最高工资
    SELECT MAX(salary), manager_id
    FROM employees
    WHERE commission_pct IS NOT NULL
    GROUP BY manager_id;
    
  • 复杂的分组查询:分组后的筛选用having

    # 复杂的分组查询:分组后的筛选用having
    # 案例1:查询哪个部门的员工个数>2
    SELECT department_id, COUNT(*)
    FROM employees
    GROUP BY department_id
    HAVING COUNT(*)>2;	# having, 指在分组后的表中进行条件筛选,能套用分组函数
    
    
    # 案例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;
    
  • 按表达式或函数分组 : group by后加表达式或单行函数/分组函数

    # 按表达式或函数分组 : group by后加表达式或单行函数/分组函数
    # 案例1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
    SELECT last_name ,LENGTH(last_name) AS len_name, COUNT(*)
    FROM employees
    GROUP BY len_name	# mysql中group by后支持别名
    HAVING COUNT(*)>5;	# mysql中having后支持别名
    
  • 按多个字段分组:group by后加多个字段进行分组

    # 按多个字段分组
    # 案例1:查询每个部门每个工种的员工平均工资
    SELECT AVG(salary), department_id, job_id
    FROM employees
    GROUP BY department_id, job_id;
    
  • 分组后添加排序

    # 添加排序
    # 案例1:查询每个部门每个工种的员工平均工资,并且按平均工资的高低显示
    SELECT AVG(salary), department_id, job_id
    FROM employees
    GROUP BY department_id, job_id
    ORDER BY AVG(salary) DESC;
    

5.1 分组查询练习
# 将以下内容复制到sql图像化客户端界面进行思考
#1. 查询各 job_id 的员工工资的最大值,最小值,平均值,总和,并按 job_id 升序
#2. 查询员工最高工资和最低工资的差距(DIFFERENCE)
#3. 查询各个管理者手下员工的最低工资,其中最低工资不能低于 6000,没有管理者的员工不计算在内
#4. 查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
#5. 选择具有各个 job_id 的员工人数

5.2 分组查询练习答案

文件名:06SQL_Groupingquery.sql
链接:https://pan.baidu.com/s/11Xqwc9F7W3SZwaRH_8sFhA?pwd=ccjz
提取码:ccjz

posted @ 2023-04-08 22:19  陈景中  阅读(31)  评论(0编辑  收藏  举报