平时学习或工作的过程中,会碰到或多或少的分页问题!具体怎么做呢?在不同的数据库产品中,会有所不同!下面我们就说说,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