oracle查询语法

 

分页查询  rownum

--分页查询
 --查询投TOP N
 --在oracle查询中,默认有一个隐藏的列"rownum",这个列可以对查询到的数据进行排序
  select p.*,rownum from libprivilege p;
  
 --执行下面两条sql,理解rownum与数据的关系
 select p.*,rownum from libprivilege p where pid<1000000;
   
 --rownum是对order(排序)前的数据建立对应对应关系的
 select p.*,rownum from libprivilege p where pid<1000000 order by pname,rownum;
 
 --查询前10条的语句,使用rownum进行控制
 select p.* from libprivilege p  where rownum<=3*10;
 
 
 --要求对权限表数据进行分页查询,每页要求查询10条数据,现在要求查出第3页的数据
   --分页查询的原理:1.先查询出前N页的数据;2.再减去N-1页的数据
    select b.* from (select p.*,rownum rn from libprivilege p  where rownum<=1*10) b where rn >(1-1)*10;
    
   --注意:每执行一次查询都会产生一个rownum
   select b.*,rownum rn2 from (select p.*,rownum rn from libprivilege p  where rownum<=1*10 ) b where rn >(1-1)*10;
   select b.*,rownum rn2 from (select p.*,rownum rn from libprivilege p  where rownum<=1*10 order by rownum desc ) b where rn >(1-1)*10;
  --注意:使用了分页查询后,如果需要进行排序查询,需要理解rownum与数据的关系
  --练习:
  --分页查询权限表第一页数据(每页查询5条),并按照pid进行排序
  select p.*,rownum from libprivilege p where rownum<=1*5 order by pid;
  --分页查询权限表第一页数据(每页查询5条),并按照pname进行排序
  -- select p.*,rownum from libprivilege p where rownum<=1*5 order by pname,rownum;--错误,这是对查询结果的排序
  --select p.*,rownum from libprivilege p where rownum<=1*5 order by pname; --错误
  
  select p.*,rownum rn from libprivilege p order by pname  --查询的是整表的数据,排序是对整个表数据的排序
   --在带排序的分页查询中,需要进行先排序后分页,否则排序的关系会乱
   select * from 
    (select p.*,rownum rn from libprivilege p order by pname) r
   where  rownum <=2*5;
  
  --三种分页查询:
  --第一种:带order排序的分页查询,需要执行三次查询
          --1.第一次查询时排序查询
          --2.第二次查询时查找出前N页数据
          --3.第三次查询时才查找出第N页数据
  
  --rownum在第一次查询中
  select p.*,rownum rn from libprivilege p order by pname;
  select * from 
   (select * from (select p.*,rownum rn from libprivilege p order by pname) r where  rn <=4*10)
   where rn>(4-1)*10;
   
   --rownum在第二次查询中
    select * from 
   (select r.*,rownum rn from (select p.* from libprivilege p order by pname) r where  rownum <=2*10)
   where rn>(2-1)*10;
   
   
    --分页查询的原理:1.先查询出前N页的数据;2.再减去N-1页的数据
    --第二种:不带order排序使用的分页查询
    select b.* from (select p.*,rownum rn from libprivilege p  where rownum<=1*10) b where rn >(1-1)*10 ;
    
    select p.*,rownum rn from libprivilege p;
    
    
    --练习:
    --1.检查没有排序时,分页后的数据和查询所有的数据,数据是否一致
    --2.检查带有排序时,分页后的数据与排序后所有的数据,数据是否一致
    
    
    --第三种:不带order排序使用的分页查询
   
   select b.* from (select p.*,rownum rn from libprivilege p  where rownum<=2*10) b where rn >(2-1)*10 ;
   --这条sql会查询整表数据,在数据量很大的表中,查询的效率低
   select b.* from (select p.*,rownum rn from libprivilege p) b  where rn<=2*10 and  rn >(2-1)*10 ;
   
   --这条sql会查找多一次全表,在数据量很大的表中,查询的效率低
   select * from 
   (select r.*,rownum rn from (select p.* from libprivilege p order by pname) r )
   where rn<=2*10 and   rn>(2-1)*10;

         
分页查询
   
    <select id="findTotal" resultType="int">

        select count(t.id)  c from goods t left outer join category c on t.category=c.id

    </select>

    <!--   <![CDATA[<=]]> 或使用  &lt;=   -->
    <select id="findList" parameterType="Pagger" resultType="Goods">

        select * from (select rownum rn,t.*,c.id as "cateInfo.id",c.cname as "cateInfo.cname" 
          from goods t left outer join category c on t.category=c.id where rownum &lt;= #{endIndex}) where rn>${startIndex}

    </select>
 
   

select * from GOODS t

--总页数--统计查询
select count(id) total from goods

select count(*) from goods;


--带排序的分页
--需要先排序后查询在分页--这样才是对整个表的数据做排序,
--如果先查询后排序,则是对查询结果做排序

--第一步,先排序
select g.*,c.id as "cateInfo.id",c.cname as "cateInfo.cname" from goods g left outer join category c on g.category=c.id order by g.name

--第二步,把排序后的数据查询出前N也
select rownum rn,k.* from
       (select g.*,c.id as "cateInfo.id",c.cname as "cateInfo.cname" from goods g left outer join category c on g.category=c.id order by g.name) k
       where rownum<=(2*5)

--第三步,把前N页数据进行二次查询,查找出第N也
select * from 
       (select rownum rn,k.* from(
       select g.*,c.id as "cateInfo.id",c.cname as "cateInfo.cname" from goods g left outer join category c on g.category=c.id order by g.name)
       k where rownum<=(3*5)) where rn>5
 


--没有排序的分页
select * from (select rownum rn,t.*,c.id as "cateInfo.id",c.cname as "cateInfo.cname" 
      from goods t left outer join category c on t.category=c.id where rownum <=20) where rn>10

--
select count(t.id)  c from goods t left outer join category c on t.category=c.id


    select * from (select rownum rn,t.*,c.id as "cateInfo.id",c.cname as "cateInfo.cname" 
          from goods t left outer join category c on t.category=c.id where rownum &lt;= #{endIndex}) where rn>${startIndex}


select rownum,id,name,price,store,gtype,smell,uptime,downtime,category,color from goods where rownum<=10

select * from 
(select rownum rn,t.*,c.id as "cateInfo.id",c.name as "cateInfo.cname" from goods t left outer join category c on t.category=c.id)
where rownum <=(2*5) where rownum<=1

 

 

 

转载于:https://www.cnblogs.com/bingo584235807/p/6040573.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值