扒扒数据库长长知识(下载资源组合看day2)之 07 (课堂练习)
2016-03-18 12:41
295 查看
习题课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
找到员工表中工资最高的前三名
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
相关文章推荐
- 数据库备份(mysql,mariadb)_mysqldump,Xtrabackup篇
- 时序列数据库武斗大会之 TSDB 名录 Part 1
- 时序列数据库武斗大会之 TSDB 名录 Part 1
- 关于Oracle的rac集群和mysql Galera Cluster的想法
- JSP连接access数据库
- JSP连接access数据库
- 数据库小知识
- 关于oracle数据库安装出现 7003/7009
- MySQL Replication主主复制—(实例)
- CUBRID学习笔记 41 sql语法之groupby 等
- sql 书写顺序
- NoSQL 数据库分类
- 使用DbVisualizer导出DB2创建序列SQL
- mongoDB基础操作,对表的常用操作
- Sqlserver 平面文件导入/ SSIS FlatFileSource导入文件时 出现LocaleID is not installed报错问题
- mysql 设置密码四种方式转载
- SQL SERVER 自动监控数据库异常,自动发送邮件通知
- 链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 外加SQL事务死锁问题
- Symfony2使用Doctrine进行数据库查询方法实例总结
- mysql数据库基础知识