mysql 和oracle分页查询

来源:互联网 发布:怎么linux安装dhcp服务 编辑:程序博客网 时间:2024/03/29 10:15

1.Mysql分页查询

1.1 LIMIT

LIMIT关键字是MySQL中特有的。它与其他种类数据库SQL语言中的TOP关键字作用类似,前者放在整个SELECT语句的最后面,而后者则必须放在输出字段列表之前(紧跟SELECT关键字的后面)。MySQL的LIMIT关键字的“亮点”在于除了它可以确定显示记录的条数外,还可以确定显示记录的起始位置,这相对于其它关系数据库的TOP关键字只能确定显示最前面的若干条记录而言有一定的优势。SQL的limit语法的如以下形式
SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset
 当省略offset的时候,offset作为0处理,表示提取查询到的前rows条数据;
 当offset>=0时候,表示提取查询到的从offset开始的rows条数据;此时如果rows<0表示提取查询到的从offset开始的所有数据
 当offset<0的时候,表示提取查询到的除出后rows条数据的所有数据,即剔除last row-rows到last rows之间的-rows条数据
 另外,如果rows大于实际查询的数据条数,则取rows为实际查询的数据条数。
二、实例
实例1
 检索记录行 6-15
SELECT * FROM table LIMIT 5,10; 
为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定rows参数为 -1: 
实例2
检索记录行 96-last
SELECT * FROM table LIMIT 95,-1; 
 如果只给定 rows 参数,它表示前rows 条数据;换句话说,LIMIT n 等价于 LIMIT 0,n
 实例3
检索前 5 个记录行
SELECT * FROM table LIMIT 5;     
实例4
返回第6-15行数据
select * from table LIMIT 5,10; 
select * from table LIMIT 5; 
select * from table LIMIT 0,5; 
实例5
返回0到last row-rows的数据
select * from class limit 10 , -1
select * from class limit -1 OFFSET 10
假如现在class表中有100条数据,则返回的是0开始的90条数据,即0到(100-10)
1.2 MySql分页查询

mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下

SELECT COUNT(*) FROM foo WHERE b = 1;//条数SELECT * FROM foo WHERE b = 1 LIMIT 100,10;//具体数据

另外一种是使用SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10;SELECT FOUND_ROWS();

 

第二种方式调用SQL_CALC_FOUND_ROWS之后会将WHERE语句查询的行数放在FOUND_ROWS()之中,第二次只需要查询FOUND_ROWS()就可以查出有多少行了。

首先原子性讲,第二种肯定比第一种好。第二种能保证查询语句的原子性,

第一种当两个请求之间有额外的操作修改了表的时候,结果就自然是不准确的了。

而第二种则不会。但是非常可惜,一般页面需要进行分页显示的时候,

往往并不要求分页的结果非常准确。即分页返回的total总数大1或者小1都是无所谓的。

所以其实原子性不是我们分页关注的重点。

结论:SQL_CALC_FOUND_ROWS和COUNT(*)的性能在都使用covering index的情况下前者高,在没使用covering index情况下后者性能高。所以使用的时候要注意这个。

参考原文:http://www.cnblogs.com/yjf512/archive/2012/10/09/2717102.html

2.oracle分页查询

select * from teacher where tno>1090

--回忆之前的MYSQL分页select * from teacher limit (pageIndex-1)*pageSize,pageSize

--oracle的分页 需要伪列? 什么是伪列!--伪列 可以从表中查询的到!每个表都有这个伪列!但是不能对伪列--进行增删改操作!伪列的值是不允许被改变的--rowid:存储的是表中行的存储地址,是唯一的!可以使用rowID定位到表中的一行--增长的规律: 最后一个字母。默认从A开始 A-Z a-z 0-9 + / 倒数第二位变成B--rownum:返回的是查询结果中 行的序号!--rownum只能对=1或者<n进行筛选,不能对>n进行筛选--如果想使用>n来查询,那么必须通过子查询建立临时表,--然后让rownum成为临时表中的列,然后限定条件使用伪列的别名

 

--查询教师表中的薪水最高前5名select * from (select * from teacherorder by sal desc)where rownum<6

 

--查询教师表中的薪水第5名select * from(select t.*,rownum rw from(select * from teacher order by sal desc) t)where rw=5

--使用分析函数 排序select * from (select t.*,dense_rank() over(order by sal desc) rankfrom teacher t)where rank=5

--查询 教师表中的薪水最高5 -9select * from(select t.*,rownum rw from(select * from teacher order by sal desc) t)where rw>=5 and rw<=9

参考http://www.cnblogs.com/liu-chao-feng/p/5890346.html

0 0
原创粉丝点击