sqlrownum分页
1. sql语句分页查询的问题
select rownum row_id,a,c1,b,c2 from (select car.a,uni1.c as c1,car.b,uni2.c as c2 from card car,unit uni1,unit uni2 where car.a=uni1.d and car.b=uni2.d) tb1 where row_id between 1 and 100
两个c就分开了
2. 求SQL分页的语句
2个参数Start end
start 开始 end 结束
例如第二页从Start11条开始 结束end 21百
select * from (select rownum a,NEWS.* from NEWS where rownum<='"+end+"') b where b.a>'"+start+"'"
方法2 select * from NEWS limit a,b
a就是从第几条开始 b就是查询出的条数
例如 从第10条开始后的10条select * from NEWS limit 10,10
从第6条开始后的8条select * from NEWS limit 6,8
3. SQl语句查询排名分页
假设成绩表为score,score列为分数,stuno为学号,student表为学生信息表,sutno为学号,name为学生姓名,endNum和startNum是页码,需要前端传入;
SELECT * FROM (select row_.*, rownum start_rownum_ from (
sum(t.score) 总分,
t1.name 姓名
from score t,student t1
where t1.stuno=t.stuno
group by t1.name
order by t.stuno
) row_ WHERE rownum < #endNum# ) WHERE start_rownum_ >= #startNum#
4. 如何使用sql语句进行分页操作
sql语句是不能进行分页操作的,它只查出一个相应条件的数据记录集。而分页操作,是由程序员用相应的软件开发语言设计算法,而过进行分页操作。谢谢
5. hibernate访问oracle分页SQL语句rownum子查询问题
第一个是从第几条开始,第二个是每页几条。
你看看你数据库里面的数据够不够分页,你这样只写两句就分页是不够的。
page = Paginator.showPage(, hql, paramValues, pageCurrent, pageSize);
/*
* 利用hql实现翻页
*/
public static Page showPage(PersistentBaseDao p, String hql,
Object[] paramValues, int pageCurrent, int pageSize) {
// 入口参数校验(无)
if (p == null) {
// log.debug("Paginator.p.hql is Empty");
}
if (hql.equals("") || hql == null) {
// log.debug("Paginator.showPage.hql is Empty");
}
if (p == null) {
// log.debug("Paginator.showPage.p is Empty");
}
PersistentBaseDao = (PersistentBaseDao) p;
// 如果当前页大于>总的页数,则让当前页等于总页数
int tempPageCount =0;
if (paramValues == null) {
tempPageCount = .getPageCount(hql, (Object[]) null, pageSize);
} else {
tempPageCount= .getPageCount(hql, paramValues, pageSize);
}
if (pageCurrent > tempPageCount) {
pageCurrent = tempPageCount;
}
// 如果当前页大于<1,则让当前页等于1
if (pageCurrent < 1) {
pageCurrent = 1;
}
// 调用.serarch()方法
if (paramValues == null) {
page = .search(hql, pageCurrent, pageSize);
} else {
page = .search(hql, paramValues, pageCurrent, pageSize);
}
// 为page对象设置当前页的属性
page.setPageCurrent(pageCurrent);
// 将page对象放在request对象中
return page;
}
/*
* 利用List实现翻页
*/
@SuppressWarnings("unchecked")
public static Page showPage(List list, int pageCurrent, int pageSize) {
// 入口参数校验(无)
if (list.isEmpty()) {
// log.debug("Paginator.showPage.list is Empty");
}
// 如果当前页大于>总的页数,则让当前页等于总页数
if (pageCurrent > page.getPageCount()) {
pageCurrent = page.getPageCount();
}
// 如果当前页大于<1,则让当前页等于1
if (pageCurrent < 1) {
pageCurrent = 1;
}
List ls = new ArrayList();
// 根据得到的list转化为page对象
if (list.size() % pageSize == 0) {
page.setPageCount((list.size() / pageSize));
} else {
page.setPageCount((list.size() / pageSize) + 1);
}
page.setPageCurrent(pageCurrent);
page.setRecordCound(list.size());
int stag = (pageCurrent - 1) * pageSize;
int etag = pageCurrent * pageSize;
for (int i = stag; i < list.size() && i < etag; i++) {
ls.add(list.get(i));
}
page.setDataList(ls);
return page;
}
6. oracle中使用rownum分页,请教一下数据的顺序会变吗
第一次的rownum是oracle中的一个虚拟列你说的rn是给这个rownum起的别名,也就是在子查询中的别名要在外查询中调用oracle中的分页查询不止是只有rownum还可以用row_number等函数(不过这个是根据某个字段排序后的排名,这个在数据量较大的情况下很影响查询效率),不过这个的调用方式也跟上边的那个类似,并且,这个row_number函数在sqlserver中也是可以使用的,具体的你可以搜索一下
7. 用SQL写出分页查询
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A --不排序
WHERE ROWNUM <= 40
)
WHERE RN >= 21;
SELECT *
FROM (SELECT a.*, row_number() over(ORDER BY 1) rn--假排序,速度同上
FROM t1 a)
WHERE rn BETWEEN 21 AND 40;
SELECT *
FROM (SELECT a.*, row_number() over(ORDER BY c1) rn --真实排序,无法比较速度
FROM t1 a)
WHERE rn BETWEEN 21 AND 40;
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。
分页查询格式:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21 到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO 一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。
因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
8. 几种常见SQL分页方式效率比较,一帖子
sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 计算前pages 条数据 pages= pageSize*(pageNumber-1) SQL语句: select top pageSize * from 表名 where id not in (select top pages id from 表名 order by id) order by id 第二种分页方法 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 pages=pageSize*(pageNumber-1)+1 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t ) mysql分页 需用到的参数: pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 起始位置 pages= pageSize*(pageNumber-1) SQL语句: select * from 表名 limit pages, pageSize; mysql 分页依赖于关键字 limit 它需两个参数:起始位置和pageSize 起始位置=页大小*(页数-1) 起始位置=pageSize*(pageNumber -1) oracle分页 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 startPage 起始位置 startPage= pageSize*(pageNumber-1)+1 endPage=startPage+pageSize SQL语句 select a.* from ( select rownum num ,t.* from 表名 t where 某列=某值 order by id asc )a where a.num>=startPage and a.num<endPage db2分页 int startPage=1 //起始页 int endPage; //终止页 int pageSize=5; //页大小 int pageNumber=1 //请求页 startPage=(pageNumber-1)*pageSize+1 endPage=(startPage+pageSize); SQL语句 select * from (select 字段1,字段2,字段3,字段4,字段5,rownumber() over(order by 排序字段 asc ) as rowid from 表名 )as a where a.rowid >= startPage AND a.rowid <endPage access分页 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 pages=pageSize*(pageNumber-1)+1 SQL语句 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )
9. 几种流行的数据库SQL分页
sqlserver分页
第一种分页方法
需用到的参数:
pageSize每页显示多少条数据
pageNumber页数从客户端传来
totalRecouds表中的总记录数selectcount(*)from表名
totalPages总页数
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages计算前pages条数据
pages=pageSize*(pageNumber-1)
SQL语句:
selecttoppageSize*from表名whereidnotin(selecttoppagesidfrom表名orderbyid)orderbyid
第二种分页方法
pageSize每页显示多少条数据
pageNumber页数从客户端传来
pages=pageSize*(pageNumber-1)+1
selecttoppageSize*from表名whereid>=(selectmax(id)from(selecttoppagesidfrom表名orderbyidasc)t)
mysql分页
需用到的参数:
pageSize每页显示多少条数据
pageNumber页数从客户端传来
totalRecouds表中的总记录数selectcount(*)from表名
totalPages总页数
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages起始位置
pages=pageSize*(pageNumber-1)
SQL语句:
select*from表名limitpages,pageSize;
mysql分页依赖于关键字limit它需两个参数:起始位置和pageSize
起始位置=页大小*(页数-1)
起始位置=pageSize*(pageNumber-1)
oracle分页
pageSize每页显示多少条数据
pageNumber页数从客户端传来
totalRecouds表中的总记录数selectcount(*)from表名
totalPages总页数
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
startPage起始位置
startPage=pageSize*(pageNumber-1)+1
endPage=startPage+pageSize
SQL语句
selecta.*from
(
selectrownumnum,t.*from表名twhere某列=某值orderbyidasc
)a
wherea.num>=startPageanda.num<endPage
db2分页
intstartPage=1//起始页
intendPage;//终止页
intpageSize=5;//页大小
intpageNumber=1//请求页
startPage=(pageNumber-1)*pageSize+1
endPage=(startPage+pageSize);
SQL语句
select*from(select字段1,字段2,字段3,字段4,字段5,rownumber()over(orderby排序字段asc)asrowidfrom表名)asawherea.rowid>=startPageANDa.rowid<endPage
access分页
pageSize每页显示多少条数据
pageNumber页数从客户端传来
pages=pageSize*(pageNumber-1)+1
SQL语句
selecttoppageSize*from表名whereid>=(selectmax(id)from(selecttoppagesidfrom表名orderbyidasc)t)
10. hql rownum分页
createQuery("select rownum no,ID from DTVS.DTVS_USER order by ID desc").setFirstResult(3).setMaxResults(2).list();
第3,4条记录.