6.分组查询


1.分组查询的简单案例
 1 # 1.分组查询的语法规则:
 2   select分组函数,列(该列要求是出现在groupby后面的列)
 3   from表
 4   [where筛选条件]
 5   groupby分组的列表
 6   [order by子句]
 7   注意:查询列表要求是分组函数和groupby后面出现的字段


8 # 2.查询每个工种的最高工资 9   # 分析:最高工资应该使用max(salary)统计函数, '每个工种' 要求按工种进行分组 10   select max(salary), job_id from employees groupby job_id;
11 # 3.查询每个位置(location_id)上的部门个数 12   # 分析: '每个位置' 要求按位置,即按location_id进行分组查询 13   select count(*), location_id from departments groupby location_id;

返回顶部


2.添加简单筛选条件的分组查询
 1 # 1.查询邮箱中包含a字符的, 每个部门的平均工资
 2   select avg(salsry), department_id
 3   from employees
 4   where email like "%a%"
 5   groupby department_id;


6 # 2.查询有奖金的每个领导手下员工的最高工资 7   select max(salary), manager_id 8   from employees 9   where commission_pct isnotnull 10   groupby manager_id;

返回顶部


3.添加复杂筛选条件的分组查询(分组后筛选)
 1 # 1.分组查询添加筛选条件:
 2   1).分组前筛选
 3   2).分组后筛选


4 # 2.分组前筛选: 分组前筛选是分组查询是以原始表为基础对查询进行条件限制, 使用where关键字, where关键字紧跟在from子句后面. 5 # 3.分组后筛选: 分组后筛选是分组查询后的结果作为再次对数据进行筛选的条件, 二次筛选使用having关键字, 位于group by子句后面. 6 如:筛选出每个部门的员工最高工资后,再筛选出最高工资大于10000的员工 7 select max(salary), department_id 8 from employees 9 groupby department_id 10 having max(salary)>10000;
11 # 4.分组前筛选与分组后筛选对比 12         数据源        位置        关键字 13 分组前筛选  原始表        groupby子句前    where 14 分组后筛选  分组后的结果集    groupby子句后    having
15 # 5.注意: 16   1).分组函数做条件可定放在having子句中 17   2).考虑到性能,能使用分组前筛选的,就优选考虑使用分组前筛选 18   3).groupby子句支持单字段分组,也支持多字段分组,多个字段用盗号分开,不区分分组字段的顺序. 19   4).分组查询中可以添加排序查询(排序放在整个分组查询的最后)

 

 1 # 1.查询哪个部门的员工个数>2
 2   select count(*), department_id
 3   from employees
 4   groupby department_id
 5   having count(*)>2;


6 # 2.查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 7   select max(salary), job_id 8   from employees 9   where commission_pct isnotnull 10   groupby job_id 11   having max(salary)>12000;
12 # 3.查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个, 以及其最低工资 13   select min(salary), manager_id 14   from employees 15   where manager_id>102 16   groupby manager_id 17   having min(salary)>5000;

 

返回顶部


4.按表达式或函数分组(不常用)
1 # 按员工姓名的长度分组, 查询每一组的员工个数, 筛选员工个数>5的有哪些
2   select count(*), length(last_name)
3   from employees
4   groupby length(last_name)
5   having count(*)>5;

返回顶部


5.按多个字段分组
1 # 查询每个部门每个工种的员工的平均工资
2   select avg(salary), department_id, job_id
3   from employees
4   groupby department_id, job_id;

返回顶部


6.添加排序的分组查询
1 # 查询每个部门每个工种的员工的平均工资, 并且按平均工资的高低显示
2   select avg(salary), department_id, job_id
3   from employees
4   groupby deparment_id, job_id
5   order by avg(salary) desc;

返回顶部


7.小练习
 1 # 1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
 2   select max(salary), min(salary), avg(salary), sum(salary), job_id
 3   from employees
 4   groupby job_id
 5   order by job_id;


6 # 2.查询员工最高工资和最低工资的差距并将差距命名为字段DIFFERENCE 7   select max(salary)- min(salary)as DIFFERENCE 8   from employees;

9 # 3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 10   select min(salary), manager_id 11   from employees 12   where manager_id isnotnull 13   groupby manager_id 14   having min(salary)>=6000
15 # 4.查询各个部门的编号,员工数量和工资平均值,并按平均工资降序 16   select department_id, count(*), avg(salary) 17   from employees 18   groupby departent_id 19   order by avg(salary) desc;
20 # 5.选择具有各个job_id的员工人数 21   select conunt(*), job_id 22   from employees 23   groupby job_id

返回顶部

转载于:https://www.cnblogs.com/Jermy/articles/10245282.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值