分组查询知识点以及案例
1 #进阶5:分组查询 2 /* 3 语法: SELECT 分组函数,列(要求出现在group by的后面) 4 from 表 5 GROUP BY 分组的列表 6 [order by子句] 7 注意: 查询列表必须特殊,要求是分组函数和group by后出现的字段 8 特点: 9 1、分组查询中断筛选条件为两类 10 数据源 位置 关键字 11 分组前筛选 原始表 GROUP BY子句的前面 WHERE 12 分组后筛选 分组后的结果集 GROUP BY子句的后面 HAVING 13 ①分组函数做条件肯定是放在having子句中 14 ②能用分组前筛选的,就优先考虑使用分组. 15 2.GROUP BY子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用得较少) 16 3、也可以添加排序(排序放在整个分组查询的最后) 17 */ 18 #引入:查询每个部门的平均工资 19 SELECT avg(salary ) FROM employees; 20 21 #简单的分组查询 22 #案例1:查询每个工种的最高工资 23 SELECT MAX(salary),job_id 24 FROM employees 25 GROUP BY job_id; 26 27 #案例2、查询每个位置上的部门个数 28 SELECT COUNT(*),location_id 29 FROM departments 30 GROUP BY location_id; 31 32 #添加筛选条件 33 #案例1:查询有幸中包含a字符的,每个部门的平均工资 34 35 SELECT avg(salary),department_id 36 FROM employees 37 WHERE email LIKE '%a%' 38 GROUP BY department_id; 39 40 #案例2:查询有奖金的每个领导手下员工的最高工资 41 SELECT MAX(salary),manager_id 42 FROM employees 43 WHERE commission_pct is not NULL 44 GROUP BY manager_id; 45 46 #添加复杂的筛选条件 47 48 #案例1:查询那个部门的员工个数>2 49 #①查询每个部门的员工个数 50 SELECT COUNT(*),department_id 51 FROM employees 52 GROUP BY department_id; 53 54 #②根据①的结果进行筛选,查询那个部门的员工个数>2 55 SELECT COUNT(*),department_id 56 FROM employees 57 GROUP BY department_id 58 HAVING COUNT(*)>2; 59 60 #案例2:查询每个工种有奖金的员工的最高工资>12000的工种变化 61 #① 查询每个工种有奖金的员工的最高工资 62 63 SELECT MAX(salary),job_id 64 FROM employees 65 WHERE commission_pct is not NULL 66 GROUP BY job_id; 67 68 #②根据①结果继续筛选,最高工资>12000 69 SELECT MAX(salary),job_id 70 FROM employees 71 WHERE commission_pct is not NULL 72 GROUP BY job_id 73 HAVING MAX(salary)>12000; 74 75 #案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及最低工资 76 SELECT manager_id,MIN(salary) 77 FROM employees 78 WHERE manager_id>102 79 GROUP BY manager_id 80 HAVING MIN(salary)>5000; 81 82 #按表达式或函数分组 83 84 #案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些 85 SELECT COUNT(*) c,LENGTH(last_name) len_name 86 FROM employees 87 GROUP BY len_name 88 HAVING C>5; 89 90 #按多个字段分组 91 92 #案例:查询每个部门每个工种的员工的平均工资 93 SELECT avg(salary) ,department_id,job_id 94 FROM employees 95 GROUP BY job_id,department_id; 96 97 #添加排序 98 #案例:查询每个部门每个工种的员工的平均工资,按平均工资的高低来排序 99 SELECT avg(salary) ,department_id,job_id 100 FROM employees 101 WHERE department_id is not NULL 102 GROUP BY job_id,department_id 103 HAVING avg(salary)>10000 104 ORDER BY avg(salary) desc; 105 106 #1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序 107 SELECT MAX(salary) a,MIN(salary) i,avg(salary) avg,SUM(salary) sum 108 FROM employees 109 GROUP BY job_id 110 ORDER BY job_id ; 111 112 113 #2.查询员工最高工资和最低工资的差距( DIFFERENCE) 114 SELECT MAX(salary)-MIN(salary) difference 115 FROM employees; 116 117 118 #3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 119 SELECT min(salary),manager_id 120 FROM employees 121 WHERE manager_id is not null 122 GROUP BY manager_id 123 HAVING MIN(salary)>=6000; 124 125 #4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序 126 SELECT department_id, COUNT(*),avg(salary) a 127 FROM employees 128 GROUP BY department_id 129 ORDER BY a DESC; 130 131 132 #5.选择具有各个job_id的员工人数 133 SELECT COUNT(*),job_id 134 FROM employees 135 WHERE job_id is not NULL 136 GROUP BY job_id;
本文来自博客园,作者:自律即自由-,转载请注明原文链接:https://www.cnblogs.com/deyo/p/13238227.html