ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle分组函数

2019-09-09 20:38:48  阅读:271  来源: 互联网

标签:salary group 函数 having dept 分组 emp Oracle id


Oracle day3

学习内容

组函数

函数

分类 作用
单值函数 对一个值、或者一个列进行操作,返回一个结果
分组函数 先分组,然后对每一组进行操作,每一组数据操作后分别得到一个结果

分组函数

组函数(分组函数),是指将数据按照某列的值进行分组后,然后使用组函数分别对每个分好的小组中的数据进行处理。所以组函数一般要结合着分组关键字group来使用。

统计分析(分组主要为了统计)

  • 分组
    group by…

  • 函数
    avg…

  • 筛选(与where类似)
    having…

  • 组函数:

    avg 求平均值
    count 计算有多少条数据
    max 最大值
    min 最小值
    sum 求和

    不常用:
    stddev 标准差
    variance 方差

  • 语句执行顺序
    where–>group by分组–>执行组函数–>having筛选->order by

  • 组函数可以出现的位置:
    1.select后面
    2.having后面
    3.order by后面
    4.where后面一定【不能】出现组函数(因为where执行时组函数还未执行)

  • where与having最大的区别:(与静态非静态很像)
    where后面拿不到组函数执行结果,having可以。

注意:如果select/having语句后面出现了组函数,那么select/having后面没有被组函数修饰的列,就必须出现在group by 后面。

where和having对比

  1. where和having都是做条件筛选的
  2. where执行的时间比having要早
  3. where后面不能出现组函数
  4. having后面可以出现组函数
  5. where语句要紧跟from后面
  6. having语句要紧跟group by后面

group by和having的关系(与if else很像)

  1. group by可以单独存在,后面可以不出现having语句
  2. having不能单独存在,有需要的话,必须出现在group by后面

order by语句

  1. 如果sql语句中需要排序,那么就一定要写在sql语句的最后面
  2. order by后也可以出现组函数

使用分组函数

不结合group分组使用

注:如果不使用group分组的话,那么默认当前查询到的所有数据是一组

avg()

  • 查询s_emp表中所有员工的平均工资
select avg(salary)
from s_emp;

在这里插入图片描述

count()

  • 查询s_emp表中共有多少条数据
select count(*)
from s_emp;

在这里插入图片描述

max()

  • 查询s_emp表中所有员工中的最大工资
select max(salary)
from s_emp;

在这里插入图片描述

min()

  • 查询s_emp表中所有员工中的最小工资
select min(salary)
from s_emp;

在这里插入图片描述

sum()

  • 查询s_emp表中所有员工的工资总和
select sum(salary)
from s_emp;

在这里插入图片描述

stddev()

  • 查询s_emp表中所有员工的工资的标准差
select stddev(salary)
from s_emp;

在这里插入图片描述

variance()

  • 查询s_emp表中所有员工的工资的方差
select variance(salary)
from s_emp;

结合group分组使用

avg()

  • 查询s_emp表中每个部门的平均工资
select dept_id,avg(salary)
from s_emp
group by dept_id;

在这里插入图片描述排序:
在这里插入图片描述

max()

  • 查询s_emp表中每个部门员工的最高工资
		select dept_id,max(salary)
		from s_emp
		group by dept_id;

在这里插入图片描述

sum()

  • 查询s_emp表中每个部门员工的工资总和
		select dept_id,sum(salary)
		from s_emp
		group by dept_id;

在这里插入图片描述

count()

  • 查询s_emp表中每个部门员工的人数
		select dept_id,count(*)
		from s_emp
		group by dept_id;

在这里插入图片描述

分组之后使用各种组函数

select dept_id,count(*),min(salary),max(salary),sum(salary),avg(salary)
from s_emp
group by dept_id;

在这里插入图片描述

结合group分组以及having筛选使用

avg()

  • 查询s_emp表中部门的平均工资大于等于1400的部门
		select dept_id,avg(salary)
		from s_emp
		group by dept_id
		having avg(salary)>=1400;

在这里插入图片描述

  • 思考:上面的sql语句修改为如下,是否可以?
		select dept_id,avg(salary)
		from s_emp
		where avg(salary)>=1400
		group by dept_id;

答:不可以。where后面不能出现分组函数。

sum()

  • 查询s_emp表中部门的总工资大于等于4000的部门
		select dept_id,sum(salary)
		from s_emp
		group by dept_id
		having sum(salary)>=4000;

在这里插入图片描述

其他实例

查询s_emp表中部门的平均工资大于等于1400的部门,并且显示出这些部门的名字,同时按照部门编号进行排序

  1. 第一步:查询出基本需求
    	select 
    		dept_id,avg(salary)
    	from 
    		s_emp
    	group by 
    		dept_id
    	having 
    		avg(salary)>=1400
    	order by 
    		dept_id;
    

在这里插入图片描述

  1. 第二步:加入多表查询,并且分别给表起别名
		select 
			se.dept_id,avg(se.salary)
		from 
			s_emp se,s_dept sd
		group by 
			se.dept_id
		having 
			avg(se.salary)>=1400
		order by 
			se.dept_id;
  1. 第三步:查询出s_dept表中的部门名称,并且进行等值连接
		select 
			se.dept_id,avg(se.salary),sd.name
		from 
			s_emp se,s_dept sd
		where 
			se.dept_id = sd.id
		group by 
			se.dept_id
		having 
			avg(se.salary)>=1400;
		order by 
			se.dept_id;
  1. 第四步:select语句后出现了组函数,那么没有被组函数修饰的列放到group by分组后面
		select 
			se.dept_id,avg(se.salary),sd.name
		from 
			s_emp se,s_dept sd
		where 
			se.dept_id = sd.id
		group by 
			se.dept_id,sd.name
		having 
			avg(se.salary)>=1400
		order by 
			se.dept_id;

在这里插入图片描述

  • 思考:是否可以把where后的条件筛选 转移 到having语句后面?
    答:可以。将where后面的筛选语句转移到having后面,效果相同。但是能写到where后面的条件就写到where后面。先筛选再操作数据效率高。
    在这里插入图片描述

标签:salary,group,函数,having,dept,分组,emp,Oracle,id
来源: https://blog.csdn.net/qq_41306364/article/details/100672489

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有