【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)
上周三面试题有两道涉及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)的更多相关文章
- Oracle和MySql的分页查询区别和PL/SQL的基本概念
Oracle和MySql的分页查询区别: Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...
- atitit。mssql sql server 转换mysql 及 分页sql ast的搭建
atitit.mssql sql server 转换mysql 及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...
- oracle或mysql定时增量更新索引数据到Elasticsearch
利用kettle Spoon从oracle或mysql定时增量更新数据到Elasticsearch https://blog.csdn.net/jin110502116/article/details ...
- mysql找出重复数据的方法
mysql找出重复数据的方法<pre>select openid,count(openid) from info group by openid,jichushezhi_id HAVING ...
- oracle sqlserver mysql数据库分页
1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...
- MySQL中删除重复数据的简单方法,mysql删除重复数据
MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式, ...
- oracle至mysql该指南的数据模式()任意数据源之间的跨导应用
为了产生的一些资源的库的释放.需要API模块迁移到mysql在,需要引导数据. 试用oracle to mysql工具.当迁移错误不说,如此大量的数据的,有了这样简陋的工具是不太可靠. 意外的发现工具 ...
- mysql重复数据查询
假设有表test mysql> select * from test; +----+------+------+ | id | name | sex | +----+------+------+ ...
- mysql中删除重复数据
//首先我们需要知道我们重复的都有哪些数据, //第一步:进行对数据表进行分组,group by. //第二步:进行后通过having进行限制筛选,条数大于等于2的 //第三步:进行多表删除. //案 ...
随机推荐
- VS 正则表达式替换内容
很少使用VS的正则替换功能,最近因为需要添加大量的默认值,但是又不想重新类,就想到了这个. 1.替换带有///描述的属性 查找的正则表达式: /// <summary>((.)*((.|\ ...
- windows使用bat文件定时备份文件
遇到一个需求,需要备份Access数据库,Access生成的数据都保存在xx.mdb文件中,所以考虑使用windows任务 定时执行一个备份文件的bat文件来解决这个问题. backup.bat文件代 ...
- oracle学习篇九:同义词
Oracle数据库中提供了同义词管理的功能.Oracle同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说, ...
- Drupal Module Hooks
Drupal is a Content Management System. Drupal is also deeply, deeply weird. While systems like Magen ...
- supersocket 通过配置文件启动服务 总是 初始化失败的 解决办法
<serverTypes> <add name="APPServerType" type="TMPServer.APP.APPServer, TMPSe ...
- 会话cookie中缺少HttpOnly属性 解决
会话cookie中缺少HttpOnly属性 解决 只需要写一个过滤器即可 1 package com.neusoft.streamone.framework.security.filter; 2 ...
- Python迭代器生成器,私有变量及列表字典集合推导式(二)
1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...
- 在Eclipse中安装JSHint插件
离线安装 1.下载插件包 http://download.eclipsesource.com/~rsternberg/jshint-eclipse-0.9.8.20130728-0004-b94b44 ...
- CSS中的EM属性之弹性布局
这篇教程将引导大家如何使用“em”来创建一个基本的弹性布局,从而学习其如何计算?又是如何使用“em”对层进行弹性扩展?又是如何扩展文本和图像等内容?下在我们就一起带着这些问题开始今天的“em”之行. ...
- apache poi根据模板导出excel
需要预先新建编辑好一个excel文件,设置好样式. 编辑好输出的数据,根据excel坐标一一对应. 支持列表数据输出,列表中列合并. 代码如下: package com.icourt.util; im ...