Oracle 表操作-组函数

/*
以下语句均 基于 [scott/tiger] 用户下的操作
*/
--分组统计各部门下工资>500的员工的平均工资
Select Avg(Sal) From Emp Where Sal>500 Group By Deptno ; 

--平均工资,处理null情况
Select Round(Avg(Nvl(Comm, 0))) From Emp;

--having 语句
Select Deptno, Job, Avg(Sal) 
From Emp 
Where Hiredate >= To_Date('1981-05-01','yyyy-mm-dd') 
Group By Deptno,Job Having Avg(Sal) > 1200 
Order By Deptno,Job;

--统计各部门下平均工资大于500的部门 
Select Deptno,Avg(Sal) From Emp 
Group By Deptno Having Avg(Sal)>500 ;

--算出部门30中得到最多奖金的员工奖金 
Select Max(Comm) From Emp Where Deptno = 30 ; 

--算出部门30中得到最多奖金的员工姓名 
Select Ename,Comm From Emp
Where Comm = (
    Select Max(Comm)
    From Emp Where deptno=30);
    
--算出每个职位的员工数和最低工资 
Select  Job,Min(Sal),Count(*) Num From Emp Group By Job;

--case查询
Select Empno, Ename, Sal, 
Case Deptno  
When 10 Then '财务部' 
When 20 Then '研发部' 
When 30 Then '销售部' 
Else '未知部门' 
End  部门 
From Emp; 

--group by 和 order by的联合使用
Select Sum(Sal+Nvl(Comm,0)) 
From Emp 
Group By Emp.Job
Order By Sum(Sal+Nvl(Comm,0)) Desc;

Select Job,Deptno,Sum(Sal+Nvl(Comm,0)) 
From Emp 
Group By Job,Deptno
Order By Sum(Sal+Nvl(Comm,0)) Desc;

Select Deptno,Job,Sum(Sal+Nvl(Comm,0)) 
From Emp 
Group By Deptno,Job;
Order By Sum(Sal+Nvl(Comm,0)) Desc;

--查询allen上司的信息
--方法1,嵌套查询
Select Empno,Ename,Hiredate
From Emp
Where Empno=(
  Select Mgr From Emp
  Where  Ename='ALLEN');
--方法2,自连接查询
Select M.Empno,M.Ename,M.Hiredate
From Emp E,Emp M 
Where E.Mgr = M.Empno
And e.Ename='ALLEN';

/*
连接:左外连接,右外连接,满外连接
可以一次用【关键字】 
left outer join
right outer join
full outer join
用+号区分时,没有+的是主表,带的是外连接表
*/
/* 左外连接 */
--形式1
Select Empno,Ename,Dname,Job
From Emp 
Left Outer Join Dept 
On Emp.Deptno = Dept.Deptno; 
--形式2
Select Empno,Ename,Dname,Job
From Emp,Dept
where Emp.Deptno = Dept.Deptno(+); 

/* 右外连 */
--形式1
Select Empno,Ename,Dname 
From Emp 
Right Outer Join Dept 
On Emp.Deptno = Dept.Deptno;
--形式2
Select Empno,Ename,Dname
From Emp,Dept
where Emp.Deptno(+) = Dept.Deptno; 

--满外连
Select Empno,Ename,Dname 
From Emp 
Full Outer Join Dept 
On Emp.Deptno = Dept.Deptno; 

/* 表可以外部连接到至多一个其它的表 所以下面这个语句是错误的*/
Select Empno,emp.Ename,Dname,Bonus.Sal
From Emp,Dept,Bonus
Where Emp.Deptno(+) = Dept.Deptno
And  Emp.Job(+)=Bonus.Job; 
--而下面这样写却是可以的
Select Empno,emp.Ename,Dname,emp.Sal
From Emp,Dept,Bonus
Where Emp.Deptno(+) = Dept.Deptno
And  Emp.Job=Bonus.Job(+); 

Select *  From  Emp
Where Sal>Any(
  Select Avg(Sal) From Emp 
  Group By Deptno
);

/*  可能会存在null行*/
Select avg(sal) From emp group by Deptno;
  
Select * From Emp
Where Sal>all(
  Select Avg(Sal) From Emp 
  Group By Deptno
  Having avg(sal)>0
);

/* 
oracle 中的分页是通过隐式字段rownum来获取行标,从而进行分段取数据
*/

--取前5条记录,Rownum是每个表的隐藏字段
Select Rownum,Empno,Ename From Emp
Where Rownum >=1 And Rownum <=5;

/* 
取emp表6-10行数据可以做如下处理
注意这个rownum隐式字段一定要起个别名如rn
否则也无法进行访问
*/
Select * From
( Select Rownum Rn,Empno,Ename From Emp) Temptable/* 隐式表 */
Where Temptable.Rn >=6 And Temptable.Rn <=10;/*引用别名来实现分页*/

/* 取emp表11-15行数据可以做如下处理 */
Select * From
( Select Rownum Rn,Empno,Ename From Emp) Temptable/* 隐式表 */
Where Temptable.Rn >=11 And Temptable.Rn <=15;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值