Oracle分组函数

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;

Oracle分组函数

count()

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

Oracle分组函数

max()

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

Oracle分组函数

min()

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

Oracle分组函数

sum()

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

Oracle分组函数

stddev()

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

Oracle分组函数

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;

Oracle分组函数排序:
Oracle分组函数

max()

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

Oracle分组函数

sum()

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

Oracle分组函数

count()

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

Oracle分组函数

分组之后使用各种组函数

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

Oracle分组函数

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

avg()

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

Oracle分组函数

  • 思考:上面的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;

Oracle分组函数

其他实例

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

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

Oracle分组函数

  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;

Oracle分组函数

  • 思考:是否可以把where后的条件筛选 转移 到having语句后面?
    答:可以。将where后面的筛选语句转移到having后面,效果相同。但是能写到where后面的条件就写到where后面。先筛选再操作数据效率高。
    Oracle分组函数

上一篇:MySQL GROUP BY …具有不同的值相同的字段


下一篇:mysql随笔