• lyt经典版MySQL基础——进阶5:分组查询


      1 #进阶5:分组查询
      2 /*
      3 引入:查询每个部门的平均工资
      4 SELECT AVG(salary) FROM employees;
      5 语法:
      6     select 分组函数,列(要求出现在group by的后面)
      7     from 表
      8     【where 筛选条件】
      9     group by 分组的列表
     10     【having 分组后的结果集】
     11     【order by 子句】
     12 注意:
     13     查询列表必须特殊,要求是分组函数和group by后出现的字段
     14 特点:
     15     1、分组查询中的筛选条件分为两类
     16             数据源            位置            关键字
     17     分组前筛选    原始表            group by子句的前面    where
     18     分组后筛选    分组后的结果集        group by子句的后面    having
     19     
     20     (1)分组函数做条件肯定是放在having子句中
     21     (2)能用分组前筛选的,就优先考虑使用分组前筛选
     22     
     23     2、group by子句支持单个字段分组,多个字段分组(多个字段之间
     24     用逗号隔开没有顺序要求),表达式或函数(用的较少)
     25     
     26     3、也可以添加排序(排序放在整个分组查询的最后)
     27 执行顺序:
     28     from --> where --> group by --> having --> select --> order by
     29 */
     30 
     31 #案例1:查询每个工种的最高工资
     32 SELECT MAX(salary),job_id FROM employees 
     33 GROUP BY job_id;
     34 #案例2:查询每个位置上的部门个数
     35 SELECT COUNT(*),location_id FROM departments
     36 GROUP BY location_id;
     37 
     38 #添加筛选条件
     39 #案例1:查询邮箱中包含a字符的,每个部门的平均工资
     40 SELECT AVG(salary),department_id FROM employees
     41 WHERE email LIKE '%a%'
     42 GROUP BY department_id;
     43 #案例2:查询有奖金的每个领导手下员工的最高工资
     44 SELECT MAX(salary),manager_id
     45 FROM employees
     46 WHERE commission_pct IS NOT NULL
     47 GROUP BY manager_id;
     48 
     49 #添加复杂的筛选条件
     50 #案例1:查询哪个部门的员工个数>2
     51 #(1)查询每个部门的员工个数
     52 SELECT COUNT(*),department_id
     53 FROM employees 
     54 GROUP BY department_id;
     55 #(2)根据(1)的结果进行筛选,查询哪个部门的员工个数>2
     56 SELECT COUNT(*),department_id
     57 FROM employees 
     58 GROUP BY department_id
     59 HAVING COUNT(*)>2;
     60 
     61 #案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
     62 #(1)查询每个工种有奖金的员工的最高工资
     63 SELECT MAX(salary),job_id FROM employees
     64 WHERE commission_pct IS NOT NULL
     65 GROUP BY job_id;
     66 #(2)根据(1)结果继续筛选,最高工资>12000
     67 SELECT MAX(salary),job_id FROM employees
     68 WHERE commission_pct IS NOT NULL
     69 GROUP BY job_id
     70 HAVING MAX(salary)>12000;
     71 
     72 #案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,
     73 #以及其最低工资
     74 #(1)查询领导编号>102的每个领导手下的最低工资
     75 SELECT MIN(salary),manager_id FROM employees
     76 WHERE manager_id>102
     77 GROUP BY manager_id;
     78 #(2)最低工资>5000的领导编号是哪个
     79 SELECT MIN(salary),manager_id FROM employees
     80 WHERE manager_id>102
     81 GROUP BY manager_id
     82 HAVING MIN(salary)>5000;
     83 
     84 #按表达式或函数分组
     85 #案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
     86 #(1)查询每个员工姓名长度的员工个数
     87 SELECT COUNT(*),LENGTH(last_name) len_name FROM employees
     88 GROUP BY len_name;
     89 #(2)添加筛选条件
     90 SELECT COUNT(*) c,LENGTH(last_name) len_name FROM employees
     91 GROUP BY len_name
     92 HAVING c>5;
     93 
     94 #按多个字段分组
     95 #案例:查询每个部门每个工种的员工的平均工资
     96 SELECT AVG(salary),department_id,job_id FROM employees
     97 GROUP BY department_id,job_id;
     98 
     99 #添加排序
    100 #案例:查询每个部门每个工种的员工的平均工资,
    101 #且平均工资>10000的,有奖金的,并且按平均工资的高低显示
    102 SELECT AVG(salary) a,department_id,job_id FROM employees
    103 WHERE department_id IS NOT NULL
    104 GROUP BY department_id,job_id
    105 HAVING a>10000
    106 ORDER BY a DESC;
    每天进步一点点,快乐生活多一点。
  • 相关阅读:
    适配器模式(2)
    设计模式之6大设计原则(1)
    Mybatis框架基础支持层——反射工具箱之MetaClass(7)
    Mybatis框架基础支持层——反射工具箱之实体属性Property工具集(6)
    Mybatis框架基础支持层——反射工具箱之对象工厂ObjectFactory&DefaultObjectFactory(5)
    Mybatis框架基础支持层——反射工具箱之泛型解析工具TypeParameterResolver(4)
    Guava动态调用方法
    数据库的数据同步
    springboot(二十二)-sharding-jdbc-读写分离
    springboot(二十一)-集成memcached
  • 原文地址:https://www.cnblogs.com/yiruliu/p/13373396.html
Copyright © 2020-2023  润新知