SQL Server数据分页的问题
selecttop页大小*fromtable1whereid>(selectmax(id)from(selecttop((页码-1)*页大小)idfromtable1or...
select top 页大小 *
from table1
where id>
(select max (id) from
(select top ((页码-1)*页大小) id from table1 order by id) as T
)
order by id
转
SELECT TOP 10 * FROM
(
SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM TABLE
) AS A
WHERE RowNo > " + pageIndex*10
pageIndex就是我们需要数据的页数
现在我有一个问题,就是当数据表中的数据上百万,我们用rownum() over(order by 字段)这个函数读取行号的时候,它的效率会怎么样?
能不能用案例说明一下,我看了还是解不了心中的疑惑! 展开
from table1
where id>
(select max (id) from
(select top ((页码-1)*页大小) id from table1 order by id) as T
)
order by id
转
SELECT TOP 10 * FROM
(
SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM TABLE
) AS A
WHERE RowNo > " + pageIndex*10
pageIndex就是我们需要数据的页数
现在我有一个问题,就是当数据表中的数据上百万,我们用rownum() over(order by 字段)这个函数读取行号的时候,它的效率会怎么样?
能不能用案例说明一下,我看了还是解不了心中的疑惑! 展开
2个回答
展开全部
//得到页号
int pageId=Integer.parseInt(request.getParameter("pageId"));
int begin=(pageId-1)*pageSize;
String select =request.getParameter("select");
String sqlLimit="";//分页sql语句
String sqlCount="";//总行数sql语句
ShowTravleInfoManager sm = new ShowTravleInfoManager();
//无条件分页查询所有景点信息
if(select.equals("all"))
{
sqlCount = "select count(*) from travleInfo";
sqlLimit="select top "+pageSize+" * from travleInfo t,areaInfo a where t.travleId not in " +
"(select top "+begin+" travleId from travleInfo) and t.areaId=a.areaId order by t.travleId";
}
一:分页的分类:
分页有真分页和假分页两种,
假分页即把所有数据一次性提取到内存中.再分页.
缺点:数据量太大.访问慢.
真分页则用SQL语句在数据库中提取本页数据到内存中. 缺点:程序不好移植.
二: 真分页作法:
一般是通过sql语句查询出指定页号的数据 .请注意数据库支持的关键字
1. sql server 用 top :前几行
2. oracle 用 rownum :行号之差
3. Mysql 用 limit ; 行号之差
三:测试:
表:
create table stuInfo-- 学生信息表
(
stuId varchar(20) primary key,
stuName varchar(20),
stuSex varchar(8),
stuAddress varchar(40)
);
insert into stuInfo values('A001','xie','男','湖南长沙');
insert into stuInfo values('A002','张飞','男','湖南长沙');
insert into stuInfo values('A003','王熙凤','男','湖南长沙');
insert into stuInfo values('A004','李逵','男','湖南长沙');
insert into stuInfo values('A005','张力','男','湖南长沙');
insert into stuInfo values('A006','张飞','男','湖南长沙');
insert into stuInfo values('A007','王凤','男','湖南长沙');
insert into stuInfo values('A008','李达','男','湖南长沙');
insert into stuInfo values('A009','xie','男','湖南长沙');
insert into stuInfo values('A010','张飞','男','湖南长沙');
insert into stuInfo values('A011','王熙凤','男','湖南长沙');
insert into stuInfo values('A012','李逵','男','湖南长沙');
insert into stuInfo values('A013','张力','男','湖南长沙');
insert into stuInfo values('A014','张飞','男','湖南长沙');
insert into stuInfo values('A015','王凤','男','湖南长沙');
insert into stuInfo values('A016','李达','男','湖南长沙');
select * from stuInfo;
在:MSSQL2005中的写法:
select top 5 * from stuInfo
where stuId not in
(select top 5 stuId from stuInfo)
order by stuId
--5:代表第2页
在:oracle中的写法:
--查询第1页数据. (当前页-1)*每页几行
select * from stuInfo where rownum<=1*5
minus
select * from stuInfo where rownum<=0*5;
在mysql中的写法:
select * from stuInfo limit 0,5;
select * from stuInfo limit 5,10;
具体用法:
一:在javaBean中,返回一个bean对象集合
public List getProductById(String id,int pageId,int pageNum)
{
Connection conn=null;
try
{ ArrayList li=new ArrayList();
int begin=(pageId-1)*pageNum;
String sql="select * from item where productid='"+id
+"' limit "+begin+","+pageNum+"";
conn= ShopDB.getConnection();
Statement st= conn.createStatement();
java.sql.ResultSet rs= st.executeQuery(sql) ;
while(rs.next())
{
Item myitem=new Item();
myitem.setItemid(rs.getString("itemid"));
myitem.setListprice(rs.getFloat("listprice"));
myitem.setUnitcost(rs.getFloat("unitcost"));
myitem.setName(rs.getString("name"));
myitem.setDescrition(rs.getString("descrition"));
myitem.setImagepath(rs.getString("imagepath"));
li.add(myitem);
}
return li;
}
catch (Exception e) {
e.printStackTrace();
return null;
}finally{
ShopDB.colseConn(conn) ;
}
二:hibernate中:返回一个二维数组集合.
//真分页方法
public List findUserPageData(int pageId,int pageNum) {
try {
int comp=(pageId-1)*pageNum;
String sql = "select * from Userinfo limit "+comp+","+pageNum;
System.out.println(sql);
SQLQuery queryObject = getSession().createSQLQuery(sql);
return queryObject.list();
} catch (RuntimeException re) {
throw re;
}
}
public static void main(String[] args) {
try {
UserinfoDAO dao = new UserinfoDAO();
List list=dao.findUserPageData(1, 2);
System.out.println("大小:"+list.size());
for (int i = 0; i < list.size(); i++) {
Object kk[] =(Object[]) list.get(i);
System.out.println("姓名" + kk[1]);
}
int pageId=Integer.parseInt(request.getParameter("pageId"));
int begin=(pageId-1)*pageSize;
String select =request.getParameter("select");
String sqlLimit="";//分页sql语句
String sqlCount="";//总行数sql语句
ShowTravleInfoManager sm = new ShowTravleInfoManager();
//无条件分页查询所有景点信息
if(select.equals("all"))
{
sqlCount = "select count(*) from travleInfo";
sqlLimit="select top "+pageSize+" * from travleInfo t,areaInfo a where t.travleId not in " +
"(select top "+begin+" travleId from travleInfo) and t.areaId=a.areaId order by t.travleId";
}
一:分页的分类:
分页有真分页和假分页两种,
假分页即把所有数据一次性提取到内存中.再分页.
缺点:数据量太大.访问慢.
真分页则用SQL语句在数据库中提取本页数据到内存中. 缺点:程序不好移植.
二: 真分页作法:
一般是通过sql语句查询出指定页号的数据 .请注意数据库支持的关键字
1. sql server 用 top :前几行
2. oracle 用 rownum :行号之差
3. Mysql 用 limit ; 行号之差
三:测试:
表:
create table stuInfo-- 学生信息表
(
stuId varchar(20) primary key,
stuName varchar(20),
stuSex varchar(8),
stuAddress varchar(40)
);
insert into stuInfo values('A001','xie','男','湖南长沙');
insert into stuInfo values('A002','张飞','男','湖南长沙');
insert into stuInfo values('A003','王熙凤','男','湖南长沙');
insert into stuInfo values('A004','李逵','男','湖南长沙');
insert into stuInfo values('A005','张力','男','湖南长沙');
insert into stuInfo values('A006','张飞','男','湖南长沙');
insert into stuInfo values('A007','王凤','男','湖南长沙');
insert into stuInfo values('A008','李达','男','湖南长沙');
insert into stuInfo values('A009','xie','男','湖南长沙');
insert into stuInfo values('A010','张飞','男','湖南长沙');
insert into stuInfo values('A011','王熙凤','男','湖南长沙');
insert into stuInfo values('A012','李逵','男','湖南长沙');
insert into stuInfo values('A013','张力','男','湖南长沙');
insert into stuInfo values('A014','张飞','男','湖南长沙');
insert into stuInfo values('A015','王凤','男','湖南长沙');
insert into stuInfo values('A016','李达','男','湖南长沙');
select * from stuInfo;
在:MSSQL2005中的写法:
select top 5 * from stuInfo
where stuId not in
(select top 5 stuId from stuInfo)
order by stuId
--5:代表第2页
在:oracle中的写法:
--查询第1页数据. (当前页-1)*每页几行
select * from stuInfo where rownum<=1*5
minus
select * from stuInfo where rownum<=0*5;
在mysql中的写法:
select * from stuInfo limit 0,5;
select * from stuInfo limit 5,10;
具体用法:
一:在javaBean中,返回一个bean对象集合
public List getProductById(String id,int pageId,int pageNum)
{
Connection conn=null;
try
{ ArrayList li=new ArrayList();
int begin=(pageId-1)*pageNum;
String sql="select * from item where productid='"+id
+"' limit "+begin+","+pageNum+"";
conn= ShopDB.getConnection();
Statement st= conn.createStatement();
java.sql.ResultSet rs= st.executeQuery(sql) ;
while(rs.next())
{
Item myitem=new Item();
myitem.setItemid(rs.getString("itemid"));
myitem.setListprice(rs.getFloat("listprice"));
myitem.setUnitcost(rs.getFloat("unitcost"));
myitem.setName(rs.getString("name"));
myitem.setDescrition(rs.getString("descrition"));
myitem.setImagepath(rs.getString("imagepath"));
li.add(myitem);
}
return li;
}
catch (Exception e) {
e.printStackTrace();
return null;
}finally{
ShopDB.colseConn(conn) ;
}
二:hibernate中:返回一个二维数组集合.
//真分页方法
public List findUserPageData(int pageId,int pageNum) {
try {
int comp=(pageId-1)*pageNum;
String sql = "select * from Userinfo limit "+comp+","+pageNum;
System.out.println(sql);
SQLQuery queryObject = getSession().createSQLQuery(sql);
return queryObject.list();
} catch (RuntimeException re) {
throw re;
}
}
public static void main(String[] args) {
try {
UserinfoDAO dao = new UserinfoDAO();
List list=dao.findUserPageData(1, 2);
System.out.println("大小:"+list.size());
for (int i = 0; i < list.size(); i++) {
Object kk[] =(Object[]) list.get(i);
System.out.println("姓名" + kk[1]);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询