分页查询
分页查询
分页查询是将查询表中数据时分段查询,而不是一次性将所有数据查询出来。
有时查询的数据量非常庞大,这导致系统资源消耗大,响应速度长,数据冗余严重。
数据库故采用分页查询,但是不同数据库语法不同。
Oracle 中的分页是基于伪列ROWNUM实现。
ruwnum 不存在任何一张表中,但是所有的表都可以查询该字段。该字段的值使随着查询自动生成的,方式是:每当可以从表中查询出一条记录,该字段的值即为该条记录的行号。 从一开始,逐次递增。
select rownum,kname,sal from k
在使用rownum对结果集进行编号过程中,不能使用rownum>1以上的数字判断,否则回合下图一样,查不出任何数据。
select * FROM (select rownum rn,sal,kname from k )where rn between 6 and 8
分页查询中有排序需求,先排序在分页查询。
如果需要查询工资6-8的员工信息,先排序,在编号,在查询。 select kname,sal,depino from order by sal desc select rownum rn,l.* from(select kname,sal,depino from order by sal desc) l select * from (select rownum rn,l.* from(select kname,sal,depino from k order by sal desc)l)where rn between 6 and 8
有时在分页查询中,只需要查部分数据,可以对用where条件限制伪列,节省资源。
select * from (select rownum rn,l.* from (select kname,sal,id from k order by sal desc) l where rownum<=8) where rn >6
计算区间公式。
pagesize:每页显示的条目数
page: 页数
start :(page-1)*pagesize+1
end:pagesize*page
select * from (select rownum rn,l.* from (select kname,sal,id from k order by sal desc) l where rownum<=end) where rn >start
decode函数
可以实现分之效果的函数。
select id,kname,sal, decode(depino, 10,sal*1.2, 20,sal*1.3, 30,sal*1.5, sal) end from k
case 操作
select depino,kname,sal, case depino when 10 then sal*1.2 when 20 then sal*1.4 else sal end bonus from k
decode()在group by 中的使用。
select count(*), decode (depino, 10,100, 20,100, 200 ) from k group by decode( depino, 10,100, 20,100, 200)
select depino,kname from k order by decode (depino, 10,1 20,2 30)
排序函数
排序函数允许对结果集按照指定的字段分组,在组内在按照指定的字段排序,最终生成组内编号。
row_number() 函数
select kname,sal,depino,row_number() over( partition by depino order by sal desc ) rank from k
rank() 函数
生成组内不连续也不唯一的数字,同组内排序字段值一样的记录,生成的数字也一样。
select kname,sal,depino,rank() over( partition by depino order by sal desc ) rank from k
dense_rank()函数
dense_rank()函数生成组内连续但不唯一的数字。
select kname,sal,depino,dense_rank() over( partition by depino order by sal desc ) rank from k
create table sales_tab( year_id number not null, month_id number not null, day_id number not null, sales_value number(10,2)not null ) insert into sales_tab select trunc(dbms_random.value(2021,2022))AS year_id, trunc(dbms_random.value(1,13))as month_id, trunc(dbms_random.value(1,32))as day_id, round(dbms_random.value(1,100),2)as sales_value from dual connect by level<=100