06 分组查询

1 什么是分组查询?

在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
这个时候我们需要使用分组查询,怎么进行分组查询呢?

            select
				...
			from
				...
			group by
				...
		计算每个部门的工资和?
		计算每个工作岗位的平均薪资?
		找出每个工作岗位的最高薪资?
		....

2 将之前的关键字全部组合在一起,来看一下他们的执行顺序?

        select
			...
		from
			...
		where
			...
		group by
			...
		order by
			...
	(1)以上关键字的顺序不能颠倒,需要记忆。
	执行顺序是什么?
		1. from
		2. where
		3. group by
		4. select
		5. order by
	
	(2)为什么分组函数不能直接使用在where后面?
		select ename,sal from emp where sal > min(sal);//报错。
		因为分组函数在使用的时候必须先分组之后才能使用。
		where执行的时候,还没有分组。所以where后面不能出现分组函数。

		select sum(sal) from emp; 
		这个没有分组,为啥sum()函数可以用呢?
			因为select在group by之后执行。

3 找出每个工作岗位的工资和?

(1)实现思路:按照工作岗位分组,然后对工资求和。

select job,sum(sal) from emp group by job;

在这里插入图片描述(2)以上这个语句的执行顺序?
先从emp表中查询数据。
根据job字段进行分组。
然后对每一组的数据进行sum(sal)
(3) select ename,job,sum(sal) from emp group by job;
在这里插入图片描述以上语句在mysql中可以执行,但是毫无意义。
以上语句在oracle中执行报错。
oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)

(4)重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数
其它的一律不能跟。

4 找出每个部门的最高薪资

(1)实现思路是什么?
按照部门编号分组,求每一组的最大值。
(select后面添加ename字段没有意义,另外oracle会报错。)

select  deptno,max(sal) from emp group by deptno;

在这里插入图片描述

5 找出“每个部门,不同工作岗位”的最高薪资?

技巧:两个字段联合成1个字段看。(两个字段联合分组)
将deptno、job相同的值分到一组,再通过max()对每一组进行处理

        select 
			deptno, job, max(sal)
		from
			emp
		group by
			deptno, job;

在这里插入图片描述

6 使用having可以对分完组之后的数据进一步过滤。

(1)having不能单独使用,having不能代替where,having必须
和group by联合使用。
(2)找出每个部门最高薪资,要求显示最高薪资大于3000的?
第一步:找出每个部门最高薪资
按照部门编号分组,求每一组最大值。

select deptno,max(sal) from emp group by deptno;

在这里插入图片描述

第二步:要求显示最高薪资大于3000

           select 
				deptno,max(sal) 
			from 
				emp 
			group by 
				deptno
			having
				max(sal) > 3000;

在这里插入图片描述
(3)思考一个问题:以上的sql语句执行效率是不是低?
比较低,实际上可以这样考虑:先将大于3000的都找出来,然后再分组。

      select 
				deptno,max(sal)
			from
				emp
			where
				sal > 3000
			group by
				deptno;

(4)优化策略:
where和having,优先选择where,where实在完成不了了,再选择
having。

7 where没办法的????

找出每个部门平均薪资,要求显示平均薪资高于2500的。

第一步:找出每个部门平均薪资

select deptno,avg(sal) from emp group by deptno;

在这里插入图片描述

第二步:要求显示平均薪资高于2500的

                select 
					deptno,avg(sal) 
				from 
					emp 
				group by 
					deptno
				having
					avg(sal) > 2500;

在这里插入图片描述

8 大总结(单表的查询学完了)

    select 
		...
	from
		...
	where
		...
	group by
		...
	having
		...
	order by
		...
以上关键字只能按照这个顺序来,不能颠倒。

(1) 执行顺序?
1. from
2. where
3. group by
4. having
5. select
6. order by

从某张表中查询数据,
先经过where条件筛选出有价值的数据。
对这些有价值的数据进行分组。
分组之后可以使用having继续筛选。
select查询出来。
最后排序输出!

(2) 找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排。

       select 
			job, avg(sal) as avgsal
		from
			emp
		where
			job <> 'MANAGER'
		group by
			job
		having
			avg(sal) > 1500
		order by
			avgsal desc;

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值