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

· Mysql

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

语法:

① limit m,n

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

示例:

-- 显示student表31~50行,共20行的结果
select * from student limit 30,20 -- 或者
select * from student limit 20 offset 30

② limit m

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

示例:

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

· Oracle

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

①rownum(伪行列)

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

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

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

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

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

②row_number() over函数

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

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

③ Rowid

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

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

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

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

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

-- 首先查出多字段重复的数据
select * from 表 a
where (a.[ID],a.[field]) IN
(
select [ID], [filed] from [TABLE]
group by [ID],[field] having count(*) > 1
)
-- 删除多余的数据,且rowid为小的
delete from 表 a
where (a.ID,a.[field]) in
(select ID,[field] from 表 group by ID,[field] having count(*) > 1)
and
rowid not in (select min(rowid) from 表 group by ID,[field] having count(*)>1)

SqlServer的top分页法

select top num from table_name
where...

举例:

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

select top 10 from student order by score

【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)的更多相关文章

  1. Oracle和MySql的分页查询区别和PL/SQL的基本概念

    Oracle和MySql的分页查询区别:     Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...

  2. atitit。mssql sql server 转换mysql 及 分页sql ast的搭建

    atitit.mssql sql server 转换mysql  及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...

  3. oracle或mysql定时增量更新索引数据到Elasticsearch

    利用kettle Spoon从oracle或mysql定时增量更新数据到Elasticsearch https://blog.csdn.net/jin110502116/article/details ...

  4. mysql找出重复数据的方法

    mysql找出重复数据的方法<pre>select openid,count(openid) from info group by openid,jichushezhi_id HAVING ...

  5. oracle sqlserver mysql数据库分页

    1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...

  6. MySQL中删除重复数据的简单方法,mysql删除重复数据

    MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式, ...

  7. oracle至mysql该指南的数据模式()任意数据源之间的跨导应用

    为了产生的一些资源的库的释放.需要API模块迁移到mysql在,需要引导数据. 试用oracle to mysql工具.当迁移错误不说,如此大量的数据的,有了这样简陋的工具是不太可靠. 意外的发现工具 ...

  8. mysql重复数据查询

    假设有表test mysql> select * from test; +----+------+------+ | id | name | sex | +----+------+------+ ...

  9. mysql中删除重复数据

    //首先我们需要知道我们重复的都有哪些数据, //第一步:进行对数据表进行分组,group by. //第二步:进行后通过having进行限制筛选,条数大于等于2的 //第三步:进行多表删除. //案 ...

随机推荐

  1. 【PPTP】windows & linux 安装pptp

    1.Windows下安装 PPTP 打开网络和共享中心 更改适配器配置 按一下alt,之后,点击左上角的文件---->新建传入连接 在新建传入连接这边点击添加用户 如输入用户名:Evelyn  ...

  2. 深入理解JavaScript系列(35):设计模式之迭代器模式

    介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 迭代器的几个特点是: 1.访问一个聚合对象的内容而无需暴露它的内部表示. 2.为遍历不同的集合 ...

  3. [转]使用 Razor 进行递归操作

    本文转自:http://www.cnblogs.com/zbw911/archive/2013/01/10/2855025.html 做一个菜单,多级的会遇到递归的问题,打算在code中做一个递归方法 ...

  4. 解决flashfxp连接虚拟机报错 530 permission denied

    菜鸟使用flashfxp遇到连接报错. [21:36:19] [R] 530 Permission denied.[21:36:19] [R] 连接失败 (连接已被客户端关闭) 搜索后发现,是因为li ...

  5. Java中使用MongoUtils对mongodb数据库进行增、删、查、改

    本文主要介绍在java应用中如何使用MongoUtils工具类对 mongodb进行增.删.查.改操作. 一.配置 1.将 common.jar库引入到项目环境中: (源代码:https://gite ...

  6. linux shell内置判断

    内置判断,成功的时候返回0,不成功返回非零 test  判断表达式 [ 判断表达式 ]       注意前后必须留空格哦 数值运算 -eq   等于 -ne   不等于 -gt     大于 -ge ...

  7. 解决iframe IE8透明不兼容

    要使 ie8 的 iframe 的透明,需要设置两点: 设置 iframe 的 allowTransparency 属性值为 true: <iframe allowtransparency=&q ...

  8. Windows 10:开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用 的解决方法

    今晨起来开机,开完机一看,弹出啦一个框框上面写着“C:\WINDOWS\system32\config\systemprofile\Desktop不可用...” 当我点击了确定之后,发现屏幕一片黑,只 ...

  9. MySQL的基础(优化)2

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  10. SQL专题

    1. 值为null的字段,假如update table set a=a+1,则会报sql错误 2. //todo