Mysql学习笔记(007)-常见函数-分组查询

分组查询

  1 #进阶5:分组查询
  2 /*
  3 语法:
  4     select 分组函数,列(要求出现group by的后面)
  5     from 表
  6     【where 筛选条件】
  7     group by 分组的列表
  8     【order by】
  9 注意:
 10     查询列表必须特殊,要求是分组函数和group by后出现的字段
 11 
 12 特点:
 13     1、分组查询中的筛选条件分为2类
 14             数据源        位置            关键字
 15     分组前筛选    原始表        group by子句的前面    where
 16     分组后筛选    分组后的结果集    group by子句的后面    having
 17 
 18     ①分组函数做条件肯定是放在having子句中
 19     ②能用分组前筛选的,就优先考虑分组前使用
 20     2、group by支持单个字段分组,过个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或者函数用的较少
 21     3、也可以添加排序(排序放在整个分组查询的最后)
 22     
 23 
 24 */
 25 
 26 #引入:查询每个部分的平均工资
 27 SELECT AVG(salary) FROM employees;
 28 
 29 #简单的分组查询
 30 #案例1:每个工种的最高工资
 31 SELECT MAX(salary), job_id
 32 FROM employees
 33 GROUP BY job_id;
 34 
 35 #案例2:查询每个位置上的部门个数
 36 SELECT COUNT(*),location_id
 37 FROM departments
 38 GROUP BY location_id;
 39 
 40 #添加分组前的筛选条件
 41 #案例1:查询邮箱中包含a字符的,每个部门的平均工资
 42 SELECT AVG(salary),department_id
 43 FROM employees
 44 WHERE email LIKE '%a%'
 45 GROUP BY department_id;
 46 
 47 #案例2:查询有奖金的每个领导手下员工的最高工资
 48 SELECT MAX(salary),manager_id
 49 FROM employees
 50 WHERE commission_pet IS NOT NULL
 51 GROUP BY manager_id;
 52 
 53 #添加分组后的筛选条件
 54 #案例1:查询哪个部门的员工个数大于2
 55 #①查询每个部门的员工个数
 56 SELECT COUNT(*),department_id
 57 FROM employees
 58 GROUP BY department_id;
 59 
 60 #②根据①的结果进行筛选,查询哪个部门的员工个数大于2
 61 SELECT COUNT(*) ,department_id
 62 FROM employees
 63 GROUP BY department_id
 64 HAVING COUNT(*)>2;
 65 
 66 #案例2:查询每个工种的有奖金的员工的最高工资>12000的工种编号和最高工资
 67 #①查询每个工种有奖金的员工的最高工资
 68 
 69 
 70 SELECT MAX(salary),job_id
 71 FROM employees
 72 WHERE commission_pet IS NOT NULL
 73 GROUP BY job_id;
 74 
 75 #②根据①的结果筛选,最高工资>12000
 76 SELECT MAX(salary),job_id
 77 FROM employees
 78 WHERE commission_pet IS NOT NULL
 79 GROUP BY job_id;
 80 HAVING MAX(salary)>12000;
 81 
 82 #案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导是哪个,以及其最低工资
 83 
 84 #①查询领导编号>102的每个领导手下员工的最低工资
 85 SELECT MIN(salary),manager_id
 86 FROM employees
 87 GROUP BY manager_id
 88 
 89 #②添加筛选条件;编号>102
 90 SELECT MIN(salary),manager_id
 91 FROM employees
 92 WHERE manager_id>102
 93 GROUP BY manager_id
 94 
 95 #③添加筛选条件:最低工资大于5000
 96 SELECT MIN(salary),manager_id
 97 FROM employees
 98 WHERE manager_id>102
 99 GROUP BY manager_id
100 HAVING MIN(salary)>5000;
101 
102 #按表达式或函数分组
103 
104 #案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
105 
106 #①查询每个长度的员工个数
107 SELECT COUNT(*),LENGTH(last_name) len_name
108 FROM employees
109 GROUP BY LENGTH(last_name);
110 #②添加筛选条件
111 SELECT COUNT(*) c,LENGTH(last_name) len_name
112 FROM employees
113 GROUP BY len_name
114 HAVING c>5;
115 
116 #按多个字段分组
117 
118 #案例:查询每个部门每个工种的员工的平均工资
119 SELECT AVG(salary),department_id,job_id
120 FROM employees
121 GROUP BY department_id,job_id
122 
123 
124 #添加排序
125 #案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
126 SELECT AVG(salary) a,department_id,job_id
127 FROM employees
128 WHERE department_id IS NOT NULL
129 GROUP BY department_id,job_id
130 HAVING a>10000
131 
132 ORDER BY a DESC;

 

练习

 1 1、查询各job_id的员工工资的最大值,最小值,平均值,总和并按job_id升序
 2 SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary),job_id
 3 FROM employees
 4 GROUP BY job_id
 5 ORDER BY job_id;
 6 
 7 #2、查询员工最高工资和最低工资的差距(DIFFERENCE 8 SELECT MAX(salary)-MIN(salary) DIFFERENCE
 9 FROM employees;
10 
11 #3、查询各个管理者手下员工最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
12 SELECT MIN(salary),manager_id
13 FROM employees
14 WHERE manager_id IS NOT NULL
15 GROUP BY manager_id
16 HAVING MIN(salary) >= 6000
17 
18 #4、查询所有部门的编号,员工数量和和工资平均值,并按平均工资降序
19 SELECT department_id,COUNT(*),AVG(salary) a
20 FROM employees
21 GROUP BY department_id 
22 ORDER BY a DESC;
23 
24 #5、选择具有各个job_id的员工人数
25 SELECT COUNT(*) 个数,job_id
26 FROM employees
27 GROUP BY job_id

 

小结

posted @ 2020-01-15 16:24  klandehu  阅读(213)  评论(0)    收藏  举报