复习巩固: mysql / sqlserver / oracle 常见数据库分页sql
空闲时间里用着mysql学习开发测试平台和测试用具,
在公司里将可用的测试平台部署,将数据库换成sqlserver
巴望着能去用oracle的公司
分页之前看一下简单的,比如从表中根据第一个字段倒序方式查询前5条记录,看看数据sample
mysql: select * from table order by column1 desc limit 5;
oracle: select top 5 * from table order by column1 desc;
mssql: select top 5 * from table order by column1 desc
mysql: select * from table order by column1 desc limit 5; oracle: select top 5 * from table order by column1 desc; mssql: select top 5 * from table order by column1 desc
mysql中的分页
limit是mysql的语法
select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 0,5
即取出第1条至第5条,5条记录
select * from tablename limit 5,5
即取出第6条至第10条,5条记录
sqlserver中分页
第一种:ROW_NUMBER() OVER()方式
select * from (
select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId from ArtistModels
) as b
where RowId between 10 and 20
select * from (
select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId from ArtistModels
) as b
where RowId between 10 and 20
---where RowId BETWEEN 当前页数-1*条数 and 页数*条数---
第二种方式:offset fetch next方式(SQL2012以上的版本才支持:推荐使用 )
select * from user order by 1 desc
offset 4 rows fetch next 5 rows only
--order by 1 desc offset 页数 rows fetch next 条数 rows only ----
select * from user order by 1 desc
offset 4 rows fetch next 5 rows only
--order by 1 desc offset 页数 rows fetch next 条数 rows only ----
第三种方式:top not in方式 (适应于数据库2012以下的版本)
select top 3 * from user
where id not in (select top 15 id from ArtistModels)
------where Id not in (select top 条数*页数 ArtistId from ArtistModels)
select top 3 * from user
where id not in (select top 15 id from ArtistModels)
------where Id not in (select top 条数*页数 ArtistId from ArtistModels)
oracle的分页
/*
* firstIndex:起始索引
* pageSize:每页显示的数量
* orderColumn:排序的字段名
* sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from tablename t) p where p.rownumber>firstIndex) where rownum<=pageSize
今天整理下Oracle分页查询,希望能够帮到其他小伙伴。
Oracle分分页查询格式:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
其中最内层的查询SELECT * FROM TABLE_NAME 表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个Oracle分分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。
在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。查询语句如下:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。
因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
完整的sql语句:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM tablename) A
WHERE ROWNUM <2*5+1
)
WHERE RN >(2-1)*5 ;
其中pageNum=2,pageSize=5,tablename为表名