Oracle 技能强化 Part 10 高级查找
1.给结果集分页。
网页查询常常是以分页的形式进行显示的,为了进行分页,需要先生成了一个序号,要先排序然后在外层才能生成正确的序号。
SELECT rn as sequence_number, ename as names, sal as salarys
/*根据前面生成的序号过滤掉6行以前的数据*/
FROM (SELECT rownum as rn, sal, ename
/*取得排序后的序号,并过滤掉10行以后的数据*/
from (
/*首先要按sal排序*/
select sal, ename from emp where sal is not NULL order by sal) x
WHERE rownum <= 10)
WHERE rn >= 6;
也可以使用row_number ()分析函数生成序号,再过滤。这样就只需要嵌套一次。
SELECT rn as sequence_number, ename as names, sal as salarys
FROM (SELECT row_number() over(order by sal) as rn, sal, ename
FROM emp
WHERE sal IS NOT NULL) x
WHERE rn BETWEEN 6 AND 10;
2.重新生成房间号
CREATE TABLE hotel(floor_nbr,room_nbr) as
SELECT 1,100 FROM dual UNION ALL
SELECT 1,100 FROM dual UNION ALL
SELECT 2,100 FROM dual UNION ALL
SELECT 2,100 FROM dual UNION ALL
SELECT 3,100 FROM dual;
/*窗函数在此不能使用*/
UPDATE hotel
SET room_nbr =
(floor_nbr * 100) + row_number() over(PARTITION BY floor_nbr);
/*可以使用merge语句*/
MERGE INTO hotel a
USING (SELECT ROWID AS rid,
(floor_nbr * 100) + row_number() over(PARTITION BY floor_nbr ORDER BY ROWID) AS room_nbr
from hotel) b
on (a.rowid = b.rowid)
when matched then
update set a.room_nbr = b.room_nbr;
select * from hotel;
3.跳过表中n行
有时候为了取样而不是查看所有数据,要求对数据进行抽样,我们前面讲过选取随机行。用取余函数mod 即可。
/*对于返回的数据增加过滤条件即可*/
SELECT ename,MOD(rn,2) as m
FROM (SELECT row_number() over(ORDER BY ename) rn,ename FROM emp)x
WHERE MOD(rn,2) = 1;
4.排列组合去重。
一个数组组合去重的问题。数据环境模拟如下:
DROP TABLE TEST PURGE;
CREATE TABLE TEST (id,t1,t2,t3) AS
SELECT 1, '1', '3', '2' FROM dual UNION ALL
SELECT 2, '1', '3', '2' FROM dual UNION ALL
SELECT 3, '3', '2', '1' FROM dual UNION ALL
SELECT 4, '4', '2', '1' FROM dual;
/*对重新合并后的数据排序并生成序号*/
SELECT id, b, row_number() over(PARTITION BY b ORDER BY id) AS sn
FROM (
/*排序并合并*/
SELECT id, listagg(b2, ',') within GROUP(ORDER BY b2) AS b
FROM (SELECT *
FROM test
/*行转列*/ unpivot(b2 FOR b3 IN(t1, t2, t3)))
GROUP BY id);
5.找到包含最大值和最小值的记录。
找出员工表中工资最大与最小的记录,在有分析函数以前,我们一直用子查询如下:
select ename, sal
from emp
where sal in (select min(sal) from emp union all select max(sal) from emp);
需要对员工表扫描三次,而用如下分析函数,只需要对员工表扫描一次即可。
SELECT ename
from (select ename, sal, min(sal) over() min_sal, max(sal) over() max_sal
from emp) x
WHERE sal in (min_sal, max_sal);
相关文章
- Oracle中设置字段空值的方法(oracle赋空值)
- 探索Oracle之路:学习新技能(oracle学习路线)
- Oracle 数据类型解析:从基础到高级(oracle中数据类型)
- 快速导出Oracle数据文件的方法(oracle导出数据文件)
- 开启Oracle之路:设置初始密码!(初始密码oracle)
- 自定义Oracle数据库中的错误处理(oracle自定义错误)
- 最近10天的数据掌握 Oracle:最近 10 天的查询(oracle只查询)
- 数据查看Oracle数据库中前10条记录(oracle前10条)
- 如何查看和修改Oracle数据库的参数配置?(查看oracle参数)
- Oracle中使用LPAD函数实现字符串左填充(lpad oracle)
- CGI数据库操作技术使用Oracle进行编程(cgi连接oracle)
- IBM和Oracle的版权之争(ibm和oracle版权)
- AIX系统Oracle数据库清理实践(aix oracle清理)
- Oracle 的 22053 版本到底有什么不同(22053 oracle)
- 数据库搭建Oracle数据库实现10万并发访问(10万并发 oracle)
- Oracle让我们看到增长的能力(oracle为什么会增长)
- Oracle交换分区提升数据处理效率(oracle交换分区效率)
- 调度方式Oracle作业调度方式多种选择满足你的需求(oracle 作业有几种)
- 利用Oracle查询当前月份(oracle中查当前月份)
- Oracle 中的 REPLACE 替换操作(oracle中替换操作)
- 据Oracle实现每页10条数据(oracle一页10条数)
- Oracle SQL认证获取高级计算能力的必要准备(oracle sql认证)
- Oracle 16数据库升级至10实现优化升级(oracle 16转10)