Oracle分组函数

1.分组函数:
多行函数\聚合函数:就是对一组中的数据进行处理获取一个结果
2.
max
min
sum
avg
count
自动忽略null值

select count(comm) from emp;
4
3.注意:
sum() avg() 只能对数值操作
max() min() 只对 日期和数值操作
count()  可以对任何类型
可以在组函数中 使用 distinct关键字去除重复的数据
select count(distinct job) from emp;
4.组函数,不能和普通的列一起使用,
要么该列是分组的依据或者在组函数内部

select count(empno),ename from emp; -- 错误
select count(empno),count(ename) from emp;
-- 统计,同名员工数量
select count(empno),ename from emp group by ename;
5.在使用count 统计数量时,禁止使用 * 号
count(*):表示统计所有列中的出现次数,返回其中次数最大的数
建议使用 count(主键)
6.group by 分组工具,提示按照什么把数据分成几块在统计

group by a,b,c 
表示 先按照 a 分成大组,在每一组中按照 b 在分组,后每一组在 按照c 细分
最后统计的是 按照c 分组后,每一组中的数据

select
to_char(hiredate,'yyyy'), to_char(hiredate,'mm'),count(empno)
from emp 
group by to_char(hiredate,'yyyy'),to_char(hiredate,'mm')
7.having:表示在分组后 进一步 筛选
只要出现以下字眼:最高工资大于xx,最低工资小于xxx
总人数xx
平均值xxx
总数xxx
查询的条件中出现聚合数据了,只能使用having 处理
    having 只能跟在 group by 后面 不能单独使用
-- 查询 部门总人数 超过 3 人的部门编号\最大工资和人数及从事工作种类;


select
   deptno,max(sal),count(empno),count(distinct job)
from emp 
     group by deptno
           having count(empno)>3
-- 查询每个部门工资超过 2000 并且人数超过 2 人的 部门编号
select
   deptno
from emp
     where sal>2000
     group by deptno
           having count(empno)>2
   
-- 查询平均工资超过 2000 的部门的名称
我们查询的数据 不是来自一张表 而是从多张表中获取
这些之间存在一定的关系(a表中某列的值等于 b表中某列的值)
表连接:同过表与表之间的关联,查询需要的数据    
在进行表连接查询时
1)必须使用表名作前缀来提高查询的效率
2)如果查询出现同名列,必须提供别名进行区分
1.笛卡尔积:a表中的所有行与 b表中的所有行以此匹配
a 中有 5行 b中有 6行 最终获取 30行
2.表连接的语法
select 子句
from 表 a,表 b,...
where a表和b表关联的条件  and  其他条件
3.在表连接的情况如何编写 sql 语句
a)清楚需要显示的是什么数据,这些放在 select 后 即可
b)清楚显示的数据来自哪些表  放在 from 后面 使用 , 分割
c)清楚 这些表 之间的关系  放在 where 后 多个关系使用 and 链接
d)如果 表是通过第三张表或更多的表建立的关系
那么 这些表 也要放在 from 中 
并且 关联的条件 放在 where 中
e)再考虑其他条件 再 where 中 添加即可


--------------------------------
1.语法:
select 子句
from 表 a,表 b,...
where 各个表关联的条件
and 其他条件
2.编写sql语句的步骤
a)用户要的是什么,这些内容是否需要聚合获取(考虑分组的依据)
b)这些内容来自哪些表或相关的表
c)确定表与表之间的关系
d)分析是否还有其他条件
e)如果显示的内容需要使用聚合函数,使用group by 
f)使用 order by 排序
注意:如果group by 或 order by 中设计的列 ,所属的表 在from 中没有,
还要在添加
--
3.表连接
a)内连接:查询表中有关联关系的数据,没有匹配的不显示
select
*
from emp e,dept d 
where e.deptno=d.deptno


b)外连接:查询某张表中的全部数据,没有匹配的显示为null
根据完成显示数据表的位置不同(根据 + 的位置不同)
左外链接:把等号左边对应表中的数据完成显示
select
*
from emp e,dept d 
where e.deptno=d.deptno(+)
右外链接:
把等号右边对应表中的数据完成显示

select
*
from emp e,dept d 
where e.deptno(+)=d.deptno;

select
*
from emp e,dept d 
where e.deptno=d.deptno(+);
select
*
from emp e,dept d 
where d.deptno(+)=e.deptno;
全外链接:左外+右外
select
   e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno(+)
union  -- 集合操作
select
e.ename,d.dname
from dept d,emp  e
where e.deptno(+)=d.deptno    
union 合并查询的结果,自动去除重复数据
union all 直接合并,不会去除重复
注意:
两个查询,获取的列数和对应列的数据类型必须一致
列名无关
自连接:通过别名把一张表 虚拟为多张表 进行表连接查询
一张表中同时描述多类事情(上下级关系)
关键在于,区分谁是主表 谁是从表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值