经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » Oracle » 查看文章
【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)
来源:cnblogs  作者:黄大管  时间:2018/9/25 19:50:45  对本文有异议

上周三面试题有两道涉及Oracle的分页查询,没有意外地凉了,现在总结一下。

 

· Mysql

mysql的分页可以直接使用关键字limit,句子写起来比较方便。

 

语法:

limit m,n

  1. -- (m+1)为取出行的起始序号
  2. -- n 为取出的全部行数
  3. select * from table where...
  4. limit m,n
  5.  
  6. -- 上述语句等价于
  7. select * from table shere...
  8. limit pageSize offset firstIndex

 

示例:

  1. -- 显示student31~50行,共20行的结果
  2. select * from student limit 30,50
  3.  
  4. -- 或者
  5. select * from student limit 50 offset 30

 

② limit m

  1. -- 表示从第一条记录行开始取出m条数据
  2. select * from table where...
  3. limit m

 

示例:

  1. -- 表示 85分以上的前十名学生
  2. select * from student where score>85 order by score DESC
  3. limit 10

 

 · Oracle

Oracle有两个方法进行分页,一个是row_number() over函数,一个是自带的ROWNUM关键词。

 

①rownum(伪行列)

rownum表示一条记录的行数,如果需要分页,至少有两层查询,内层查询符合条件的全部rownum,分页信息在外层控制。

注意:rownum是对结果集的编序排列,始终是从1开始,所以rownum直接使用时不允许使用>号

  1. select * from
  2.   (select a.*,ROWNUM rn from(sql) a
  3.   where ROWNUM<=(firstIndex+pageSize)) -- 内层控制最大值
  4. where rn>firstIndex -- 外层控制最小值

 

示例,结果集每页20行,现在要展示第二页的数据(即21~40行):

  1. SELECT * FROM
  2.   (
  3.   SELECT A.*, ROWNUM RN
  4.   FROM (SELECT * FROM TABLE_NAME) A
  5.   WHERE ROWNUM <= 40 -- 末序号,20*2
  6.   )
  7. WHERE RN >= 21 -- 起始序号

 

②row_number() over函数

通常更多地应用于排序的场景。例如,根据成绩倒叙,选取前21~40名学生

  1. select * from
  2.   (select a.*,row_number() over(order by a.score DESC) orderNum
      from student a)
  3. where orderNum between 21 and 40

 

③ Rowid

rowid是数据的详细地址(表示每一列对应的十六进制物理地址值),通过rowid,oralce可以快速的定位某行具体的数据的位置。

对于同一条记录, 查询条件不同, rownum会不同, 但是rowid将不变。通常rowid可用于剔除重复数据

 

一、重复数据根据单字段判断

  1. -- 首先查出该字段重复的数据
  2. select * from [TABLE] group by [ID] having count[ID] > 1
  3. -- 字段重复的数据中,找出rowid较小的那些数据
  4. select min(rowid) from [TABLE] group by [ID] having count(*) > 1
  5. -- 删除多余的数据,只保留重复数据中rowid较小的那个
  6. delete * from [TABLE]
  7. where [id] in ( select * from [TABLE] group by [ID] having count[ID] > 1 )
  8. and
  9. rowid not in ( select min(rowid) from [TABLE] group by [ID] having count(*) > 1 )

 

二、重复数据根据多字段判断

  1. -- 首先查出多字段重复的数据
  2. select * from a
  3. where (a.[ID],a.[field]) IN
  4. (
  5. select [ID], [filed] from [TABLE]
  6. group by [ID],[field] having count(*) > 1
  7. )
  8. -- 删除多余的数据,且rowid为小的
  9. delete from a
  10. where (a.ID,a.[field]) in
  11. (select ID,[field] from group by ID,[field] having count(*) > 1)
  12. and
  13. rowid not in (select min(rowid) from group by ID,[field] having count(*)>1)

 

SqlServer的top分页法

  1. select top num from table_name
  2. where...

 举例:

选择student表中score排行最高的10位

  1. select top 10 from student order by score

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号