MySQL和SQL Server中的分页

平时学习或工作的过程中,会碰到或多或少的分页问题!具体怎么做呢?在不同的数据库产品中,会有所不同!下面我们就说说,MySQL和SQL Server中是如何实现分页的(Oracle正在学习中,不太清楚,以后了补上)。
下面首先来说说在MySQL中是如何实现分页的。
1.MySQL
以一个具体的例子,来说明这个问题。
建立表:
create table student
(
id varchar(10) not null primary key,
name varchar(20)
);
想表中插入数据,越多的话,分页效果越明显。
insert into student values('1','liuming');
...
分页(很简单的):
select * from student where id limit 2,3 order by id;
上面的意思是从student表中取出id从2开始的3条记录。
2.SQL Server
和上面一样,先建表,然后举例说明分页。
建立表:
CREATE TABLE [dbo].[student] (
 [id] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

像这个表中插入数据(越多,分页效果越明显),有好几种办法:

1.insert into student values('1','liuming')

...

2.写一个存储过程,自动的加入数据,下面就简单的写一个:

create procedure insert_info
as
declare @id int,
 @name varchar(20)
set @id=1
while @id<=2000
begin
set @name=convert(varchar(20),@id)
insert into student(id, name) values(@id,@name)
set @id=@id+1
end

执行这个存储过程后,就可以向student表中插入2000条数据。

下面就介绍常用的几种分页方案:

1.分页方案一(利用Not In 和select top分页)

select top 10 *
from student
where (id not in
      (select top 20 id from student order by id))
order by id
语句形式:

select top 页大小

from 表

where (id not in

      (select top 页大小 * (页数-1) id from 表 order by id))

order by

2.分页方案二(利用id大于多少和select top 分页)

select top 10 *
from student
where (id >

      (select max(id) from (select top 20 id from student order by id)as t))
order by id
语句形式:

select top 页大小 *
from 表

where (id >

      (select max(id) from (select top 页大小*(页数-1) id from 表 order by id)as t))
order by id

但是上面的方法取第一页的时候有一个问题,因为最里面select取出的是id为null,所以可以用下面的方法修正:

where (id >

      isnull((select max(id) from (select top 页大小*(页数-1) id from 表 order by id)as t),0))
order by id

其他的方案:如果没有主键的话,可以用临时表,也可以用方案三座,但是效率比较低。

建议在优化的时候,加上主键和索引,这样可以提高效率。

 

从数据库表中的第M条记录开始取N条记录,可以使用top关键字。如果在select语句中同时使用top和order by 关键字,则是从排序后的数据中选择结果集。

select *
from (select top N * from 
      (select top (count(*)  -M) * from 表名称 order by 主键 desc) t1)t2
order by 主键

简写为如下形式(前提是结果集不需要排序):

select top N * from 
      (select top (count(*) -M) * from 表名称 order by 主键 desc) t1

order by 主键

例如:

select *
from (select top 20 * from 
      (select top 40 * from student order by id desc) t1)t2
order by id

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值