扒扒数据库长长知识(下载资源组合看day2)之 07 (课堂练习)





习题课1
找到员工表中工资最高的前三名



select * from emp
order by sal desc
/



select rownum, empno, ename  from emp

求不排序的前3条
 1  select rownum, empno, ename  from emp
 2* where rownum <=3

SQL> /

   ROWNUM      EMPNO ENAME
---------- ---------- ----------
        1       7369 SMITH
        2       7499 ALLEN
        3       7521 WARD
        
        


 ROWNUM的知识点
 1 ROWNUM按照oracle的默认机制生成, 
 2 rownum 只能使用<= < 号,,不能使用 > >=
 
 =======================rownum的实现机制有关系
 rownum表示,返回的结果集的行号(是一个属性,固化到一行只中,不会因为你排序,而发生变化)..
  没有第一行,就没有第二行;
  没有第二行,就没有第三行

 


 
Top-N
select  rownum, empno, ename, sal
from (select empno, ename , sal 
from emp
order by sal desc) 
where rownum<=3
/


 
分页  5=<x<=8




select  rownum, empno, ename, sal
from (select empno, ename , sal 
from emp
order by sal desc) 
where rownum<=8 and rownum>=5
/

=======错误
SQL> ed
已写入 file afiedt.buf

 1  select  rownum, empno, ename, sal
 2     from (select empno, ename , sal
 3             from emp
 4             order by sal desc)
 5*  where rownum<=8 and  rownum>=5
SQL> /

未选定行


SQL>



 

select  rownum r, empno, ename, sal
from (select empno, ename , sal 
from emp
order by sal desc) 
where rownum<=8  B


========================================
m=<x<=n

select r, empno, ename, sal
from  
(
select  rownum r, empno, ename, sal
from (select empno, ename , sal 
from emp
order by sal desc

where rownum<=8

)

where r>=5


        R      EMPNO ENAME             SAL
---------- ---------- ---------- ----------
        5       7698 BLAKE            2850
        6       7782 CLARK            2450
        7       7499 ALLEN            1600
        8       7844 TURNER           1500



======>分页 内层排序 外层选

=======oracle分页思想总结

(内层排序 外层选,需要三层查询) 
内:排序。
中:使用rownum选择前n条;并给rownum指定一个别名,以供最外层过滤使用。
外:去掉前m条结果。



习题2: 找到员工表中薪水大于本部门平均薪水的员工


员工表   本部门平均薪水

思路1: 查员工的薪水   本部门平均薪水  
本部门关系



要去本部门的薪水,需要求部门的薪水,要对部门分组  ====>分组s


select deptno, avg(sal)
from emp
group by deptno  部门薪水表

思路2 查找员工表 和 部门薪水表 ====> 多表查询

思路3 :等值连接条件

方法1
select e.empno, e.ename, e.sal, d.avgsal
from emp e, 
(select deptno, avg(sal) avgsal
from emp
group by deptno) d
where e.deptno=d.deptno  and e.sal > d.avgsal


考察点: 分组  多表查询 等值连接条件 别名 分组函数

    EMPNO ENAME             SAL     AVGSAL
---------- ---------- ---------- ----------
     7499 ALLEN            1600 1566.66667
     7566 JONES            2975       2175
     7698 BLAKE            2850 1566.66667
     7788 SCOTT            3000       2175
     7839 KING             5000 2916.66667
     7902 FORD             3000       2175

已选择6行。

方法2   相关子查询:   主查询的参数,让子查询用...一般是通过别名技术
一般子查询: 子查询的结果,被主查询使用



select avg(sal)  from emp where deptno = 10

select empno, ename, sal, (select avg(sal)  from emp where deptno =10) avgsal
from emp e
where sal > (select avg(sal)  from emp where deptno = 10) 
求本部门的平均薪水, ====>


===========================
select empno, ename, sal, (select avg(sal)  from emp where deptno = e.deptno) avgsal
from emp e
where sal > (select avg(sal)  from emp where deptno = e.deptno) 
求本部门的平均薪水, ====>

select avg(sal)  from emp where deptno = 10


    EMPNO ENAME             SAL     AVGSAL
---------- ---------- ---------- ----------
     7499 ALLEN            1600 1566.66667
     7566 JONES            2975       2175
     7698 BLAKE            2850 1566.66667
     7788 SCOTT            3000       2175
     7839 KING             5000 2916.66667
     7902 FORD             3000       2175








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值