【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的 //第三步:进行多表删除. //案 ...
随机推荐
- jstl标注标签库
1. 常用标签 引入标签库: <%@ taglib prefix=”c” uri=”” %> 1. C 标签 (1)<c:out value=”” default=” ...
- linux下快速安装python3.xx
安装python3之前的准备工作: 当前环境是centos操作系统[已经安装了gcc++],在安装前需要安装zlib-devel包: yum install zlib-devel yum instal ...
- javascript方法重载惹的祸
先贴出代码,看看执行结果会是什么? function ShowMsg() { //函数1 this.sure = function () { alert("ok"); }; //函 ...
- 05.while循环的练习
练习1: namespace _05.while循环练习01 { class Program { static void Main(string[] args) { //打印100次"努力学 ...
- MySQL出现时区错误的解决方法
目录 环境 问题 分析 解决方法 环境 windows10 MySQL 8.0.13 IDEA 问题 The server time zone value 'Öйú±ê׼ʱ¼ä' is unre ...
- 进程和程序(Process and Program)
原出处:http://oss.org.cn/kernel-book/ch04/4.1.htm ----------------------------------个人理解分割线------------ ...
- 关于Java中用Double型运算时精度丢失的问题
注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...
- 从零开始的全栈工程师——ajax
AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = Asynchronous JavaScript and XML. AJAX 是一种用于创建快速动态网页 ...
- LOJ#2552. 「CTSC2018」假面(期望 背包)
题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...
- 数组reduce和map方法
1.有一个长度为100的数组,请以优雅的方式求出该数组的前10个元素之和 var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],sum ...