mysql 和oracle分页查询

16 篇文章 0 订阅
4 篇文章 0 订阅
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 teacher
order 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) rank
from teacher t
)
where rank=5

--查询 教师表中的薪水最高5 -9
select * 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值