关于分页SQL的小总结
select id="findPage" resultMap="MinOrderInfo" parameterType="map"> SELECT o.*,w.name buyName,w.MOBILE buyMobile,aa.name sellName,aa.MOBILE sellMobile,rs.CAR_BRAND_NAME carBrandName1,rs.TRANS_PRICE,scn.price,scs.CAR_BRAND_NAME carBrandName3,scs.EXPECT_TRANS_PRICE FROM order_info o INNER JOIN web_user w ON w.id=o.SEARCH_USER_ID LEFT JOIN (SELECT o.SOURCE_USER_ID ,w.name,w.MOBILE mobile,o.Id FROM order_info o INNER JOIN web_user w ON w.id=o.SOURCE_USER_ID) aa ON aa.Id=o.Id LEFT JOIN release_source rs ON o.source_id = rs.id LEFT JOIN search_car_normal scn ON o.SEARCH_normal_ID = scn.id LEFT JOIN search_car_special scs ON o.search_special_ID = scs.id WHERE 1= 1 <if test="id != null and id != ‘‘">and o.Id = #{id}</if> <if test="sourceId != null and sourceId != ‘‘">and o.SOURCE_ID = #{sourceId}</if> <if test="sourceUserId != null and sourceUserId != ‘‘">and o.SOURCE_USER_ID = #{sourceUserId}</if> <if test="searchId != null and searchId != ‘‘">and o.SEARCH_ID = #{searchId}</if> <if test="searshUserId != null and searshUserId != ‘‘">and o.SEARCH__USER_ID = #{searshUserId}</if> <if test="num != null and num != ‘‘">and o.NUM = #{num}</if> <if test="depositPrice != null and depositPrice != ‘‘">and o.DEPOSIT_PRICE = #{depositPrice}</if> <if test="registratAddress != null and registratAddress != ‘‘">and o.REGISTRAT_ADDRESS = #{registratAddress}</if> <if test="pullCarTime != null and pullCarTime != ‘‘">and o.PULL_CAR_TIME = #{pullCarTime}</if> <if test="remark != null and remark != ‘‘">and o.REMARK = #{remark}</if> <if test="createTime != null and createTime != ‘‘">and o.CREATE_TIME = #{createTime}</if> <if test="payTime != null and payTime != ‘‘">and o.PAY_TIME = #{payTime}</if> <if test="state != null and state != ‘‘">and o.STATE = #{state}</if> <if test="orderAmt != null and orderAmt != ‘‘">and o.ORDER_AMT = #{orderAmt}</if> <if test="orderType != null and orderType != ‘‘">and o.ORDER_TYPE= #{orderType}</if> <if test="buyName != null and buyName != ‘‘">and w.NAME like CONCAT(‘%‘,#{buyName},‘%‘)</if> <if test="buyMobile != null and buyMobile != ‘‘">and w.MOBILE like CONCAT(‘%‘,#{buyMobile},‘%‘)</if> <if test="startTime !=null and startTime !=‘‘">and o.CREATE_TIME >#{startTime}</if> <if test="endTime !=null and endTime !=‘‘">and o.CREATE_TIME <#{endTime}</if> <if test="orderNumber != null and orderNumber != ‘‘">and o.ORDER_NUMBER like CONCAT(‘%‘,#{orderNumber},‘%‘)</if> ORDER BY o.CREATE_TIME DESC limit #{startRow},#{pageSize} </select>
<select id="findPageTotal" resultType="int" parameterType="map"> SELECT COUNT(1) FROM(SELECT o.*,w.name buyName,w.MOBILE buyMobile,aa.name sellName,aa.MOBILE sellMobile,rs.TRANS_PRICE,scn.price,scs.EXPECT_TRANS_PRICE FROM order_info o INNER JOIN web_user w ON w.id=o.SEARCH_USER_ID LEFT JOIN (SELECT o.SOURCE_USER_ID ,w.name,w.MOBILE mobile,o.Id FROM order_info o INNER JOIN web_user w ON w.id=o.SOURCE_USER_ID) aa ON aa.Id=o.Id LEFT JOIN release_source rs ON o.source_id = rs.id LEFT JOIN search_car_normal scn ON o.SEARCH_normal_ID = scn.id LEFT JOIN search_car_special scs ON o.search_special_ID = scs.id WHERE 1= 1)qq WHERE 1= 1 <if test="id != null and id != ‘‘">and Id = #{id}</if> <if test="sourceId != null and sourceId != ‘‘">and SOURCE_ID = #{sourceId}</if> <if test="sourceUserId != null and sourceUserId != ‘‘">and SOURCE_USER_ID = #{sourceUserId}</if> <if test="searchId != null and searchId != ‘‘">and SEARCH_ID = #{searchId}</if> <if test="searshUserId != null and searshUserId != ‘‘">and SEARCH__USER_ID = #{searshUserId}</if> <if test="num != null and num != ‘‘">and NUM = #{num}</if> <if test="depositPrice != null and depositPrice != ‘‘">and DEPOSIT_PRICE = #{depositPrice}</if> <if test="registratAddress != null and registratAddress != ‘‘">and REGISTRAT_ADDRESS = #{registratAddress}</if> <if test="pullCarTime != null and pullCarTime != ‘‘">and PULL_CAR_TIME = #{pullCarTime}</if> <if test="remark != null and remark != ‘‘">and REMARK = #{remark}</if> <if test="createTime != null and createTime != ‘‘">and CREATE_TIME = #{createTime}</if> <if test="payTime != null and payTime != ‘‘">and PAY_TIME = #{payTime}</if> <if test="buyName != null and buyName != ‘‘">and buyName like CONCAT(‘%‘,#{buyName},‘%‘)</if> <if test="buyMobile != null and buyMobile != ‘‘">and buyMobile like CONCAT(‘%‘,#{buyMobile},‘%‘)</if> <if test="startTime !=null and startTime !=‘‘">and CREATE_TIME >#{startTime}</if> <if test="endTime !=null and endTime !=‘‘">and CREATE_TIME <#{endTime}</if> <if test="state != null and state != ‘‘">and STATE = #{state}</if> <if test="orderAmt != null and orderAmt != ‘‘">and ORDER_AMT = #{orderAmt}</if> <if test="orderType != null and orderType != ‘‘">and ORDER_TYPE=#{orderType}</if> <if test="orderNumber != null and orderNumber != ‘‘">and ORDER_NUMBER like CONCAT(‘%‘,#{orderNumber},‘%‘)</if> </select>
<if test="buyName != null and buyName != ‘‘">and buyName like CONCAT(‘%‘,#{buyName},‘%‘)</if> 注意此处需用别名 不能直接用name 作为条件 否则当页面传值查询时候会报SQL语句查不到相应字段!
页面jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%><%@ taglib uri="/WEB-INF/tld/fmt.tld" prefix="fmt"%><c:set var="ctx" value="${pageContext.request.contextPath}" /><!-- ubo --><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>订单管理</title><meta content=‘width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no‘ name=‘viewport‘><link href="${ctx}/resources/css/css.css" rel="stylesheet" type="text/css" /><!-- Bootstrap 3.3.4 --><link href="${ctx}/resources/frame/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" /><!-- Font Awesome Icons --><link href="${ctx}/resources/frame/dist/css/font-awesome.min.css" rel="stylesheet" type="text/css" /><!-- Ionicons --><link href="${ctx}/resources/frame/dist/css/ionicons.min.css" rel="stylesheet" type="text/css" /><!-- Theme style --><link href="${ctx}/resources/frame/dist/css/AdminLTE.min.css" rel="stylesheet" type="text/css" /><!-- AdminLTE Skins. Choose a skin from the css/skins folder instead of downloading all of them to reduce the load. --><link href="${ctx}/resources/frame/dist/css/skins/_all-skins.min.css" rel="stylesheet" type="text/css" /><!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --><!-- WARNING: Respond.js doesn‘t work if you view the page via file:// --><!--[if lt IE 9]> <script src="${ctx}/resources/frame/dist/js/html5shiv.min.js"></script> <script src="${ctx}/resources/frame/dist/js/respond.min.js"></script> <![endif]--> </head> <body class="skin-blue sidebar-mini"> <div class="wrapper"> <%@ include file="../../main_header.jsp"%> <%@ include file="../../main_sidebar.jsp"%> <!-- Content Wrapper. Contains page content --> <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <h1> 优博车平台 <small>订单管理</small> </h1> </section> <!-- Main content --> <section class="content"> <div class="row"> <div class="col-xs-12"> <div class="box"> <div class="box-header"> <form method="post" id="queryForm" action="${ctx }/orderinfo/list" name="form1"> <div class="box-tools"> <input type="hidden" name="currentPage" id="currentPage" value="${page.currentPage}"> </div> <div class="box-header"> <div class=""> <input type="text" class="form-control input-sm pull-left" style="width: 150px;" placeholder="订单号" name="orderNumber" value="${orderNumber}" maxlength="30"> <input type="text" class="form-control input-sm pull-left" placeholder="买方用户查找" name="buyName" value="${buyName}" style="width: 100px; margin-left:15px;" maxlength="20"> <input type="text" class="form-control input-sm pull-left" placeholder="买方手机号查找" name="buyMobile" value="${buyMobile}" style="width: 130px; margin-left:15px;" maxlength="20"> <select class= "form-control input-sm pull-left" name="orderType" id="orderType" style="width:150px;height:30px; margin-left:20px;"> <option <c:if test="${orderType == ‘0‘}">selected="selected"</c:if> value="">类型</option> <option <c:if test="${orderType == ‘1‘}">selected="selected"</c:if> value="1">销车订单</option> <option <c:if test="${orderType == ‘2‘}">selected="selected"</c:if> value="2">普通寻车订单</option> <option <c:if test="${orderType == ‘3‘}">selected="selected"</c:if> value="3">竞价寻车订单</option> </select> <input type="text" class="form-control input-sm pull-left" style="width: 100px; margin-left:20px;" placeholder="创建起始日期" name="startTime" value="${startTime}" readonly="true" onclick="WdatePicker({dateFmt:‘yyyy-MM-dd‘})"> <input type="text" class="form-control input-sm pull-left" style="width: 100px; margin-left:20px;" placeholder="创建结束日期" name="endTime" value="${endTime}" readonly="true" onclick="WdatePicker({dateFmt:‘yyyy-MM-dd‘})"> <button class="btn btn-sm btn-default" id="queryBtn" style=" margin-left:20px;">查询</button> </div> </div> </form> </div> <!-- /.box-header --> <div class="box-body table-responsive no-padding"> <table class="table table-hover"> <tr> <th class="col-md-1" style="width: 10%">订单号</th> <th class="col-md-1" style="width: 6%">买家姓名</th> <th class="col-md-1" style="width: 8%">买家手机号</th> <th class="col-md-1" style="width: 6%">卖家姓名</th> <th class="col-md-1" style="width: 10%">创建时间</th> <th class="col-md-1" style="width: 8%">订单金额</th> <th class="col-md-1" style="width: 8%">类型</th> <th class="col-md-1" style="width:10%">提车时间</th> <th class="col-md-1" style="width: 8%">状态</th> <th class="col-md-1" style="width: 15%">操作</th> <c:if test="${page.items != null}"> <c:forEach items="${page.items}" var="orderinfo"> <tr> <td>${orderinfo.orderNumber }</td> <td>${orderinfo.buyName }</td> <td>${orderinfo.buyMobile }</td> <td>${orderinfo.sellName }</td> <td><fmt:formatDate value="${orderinfo.createTime}" pattern="yyyy.MM.dd HH:mm:ss" /></td> <td>${orderinfo.orderAmt }万元</td> <td><c:if test="${orderinfo.orderType==‘1‘}">销车订单 </c:if> <c:if test="${orderinfo.orderType==‘2‘}">普通寻车订单 </c:if> <c:if test="${orderinfo.orderType==‘3‘}">竞价寻车订单 </c:if></td> <td><fmt:formatDate value="${orderinfo.pullCarTime}" pattern="yyyy.MM.dd HH:mm:ss" /></td> <td><c:if test="${orderinfo.state==‘1‘}">待支付 </c:if> <c:if test="${orderinfo.state==‘2‘}">已冻结订金 </c:if> <c:if test="${orderinfo.state==‘3‘}">已支付订金 </c:if> <c:if test="${orderinfo.state==‘4‘}">已完成 </c:if> <c:if test="${orderinfo.state==‘5‘}">已取消 </c:if> <c:if test="${orderinfo.state==‘6‘}">已删除 </c:if> <c:if test="${orderinfo.state==‘7‘}"><b style="color:red;">纠纷处理中</b> </c:if> <c:if test="${orderinfo.state==‘8‘}"><b style="color:red;">纠纷处理成功</b> </c:if></td> <td><a href="${ctx}/orderinfo/detail?id=${orderinfo.id }" class="btn btn-sm btn-primary detailBtn">详细</a> <c:if test="${orderinfo.state==‘7‘}"><b style="color:red;"><a href="${ctx}/orderinfo/edit?id=${orderinfo.id }" class="btn btn-sm btn-primary detailBtn">违约处理</a></b> </c:if> </td> </tr> </c:forEach> </c:if> <c:if test="${empty page.items}"> <tr> <td colspan="10"><p class="text-center text-danger">暂无数据</p></td> </tr> </c:if> </table> </div> <!-- /.box-body --> < var cpro_id = "u6292429";小编还为您整理了以下内容,可能对您也有帮助:
SQL数据库分页原理(sql分页)
要想分页,首先得做好准备工作。你要先声明每页显示多少条数据,还得获取当前选择的是多少页的页码。有了这两个分页就好办了。
sql如下:selecttop10fromtableName
where(idnotin(selecttop20fromtableNameorderbyIddesc))orderbyIddesc
每页显示的数量:自己定义。
总页数:数据总条数/每页显示的条数
当前页码的计算方法:(页码-1)*每页显示的数量。比如我要浏览第3页的数据,3从客户端传送过来后,在后台对页码进行处理:(3-1)*每页显示的数量(假如是10).算出来后的结果就是20.你在把20以参数注入的方式动态添加到上面那个20那里就ok了。
sql中的10表示你每页显示的数据,这里跟10,就代表每页显示10条。(你可以定义一个常量作为每页显示的条数)
where中的20表示不包括前面的20条数据,也就是查询出从第21条到30之间的数据。
不知道我这样说你是否理解,其实只要理解了sql语句,分页就很好做了。
如何使用sql语句进行分页操作?
利用SQL语句分页要看你用的什么数据库。Oracle数据库可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;SQLServer数据库可以用Top或者row_number()函数,道理同上。利用SQL分页有局限性,就是针对不同的数据库有不同的写法,所以通常会在应用程序里面做分页通用性比较强。但是对于数据量非常庞大的应用来说,还是用SQL分页比较适合。如何使用sql语句进行分页操作?
MySQL分页的sql语言怎么写?
1、首先我们建立一个表表的数据,这个表里有25条数据,id从1到25。(下图是部分截图)
2、要分页数据,首先我们假设一页有10条数据,我们可以用mysql的limit关键字来限定返回多少条数据。并且用orderby来排序数据,这里用id来排序。所以第一页的sql可以如图这样写。
3、执行后得到的数据如图,就是id从1到10的前10条数据,因为我们是按id升序来排序的。
4、上面第一页的sql是简化的写法,完整的写法如图,得到的结果和上图的一模一样。代码里limit0,10的意思是从第一条数据开始,取10条数据。(注意的是第一条数据是从0开始的)
5、那么第二页的数据,关键是要知道是从哪一条数据开始,可以用这个公式得到:(页码-1) *每页显示多少条,即(2-1)*10=10,所以sql语句如图,limit10,10。
6、执行后,结果正确,得到id从11到20的10条数据。
7、同理第三页数据的sql如图,<br/>就是limit20,10。
8、查询的结果如图,因为这页只剩下5条数据了,所以只显示5条数据。如果你有更多页的数据,后面的数据只需要按上面的公式,得到从哪行开始,就可以写对应的sql语句了。
几种常见SQL分页方式
create table pagetest
(
id int identity(1,1) not null,
col01 int null,
col02 nvarchar(50) null,
col03 datetime null
)--分页1,not in/top
select top 50 * from pagetest
where id not in (select top 9900 id from pagetest order by id)
order by id
--分页2,not exists
select top 50 * from pagetest
where not exists
(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)
order by id
--写法3,max/top
select top 50 * from pagetest
where id>(select max(id) from (select top 9900 id from pagetest order by id)a)
order by id
--分页4,row_number()
select top 50 * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900 and rownumber<9951
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber between 9901 and 9950
--分页5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select *
from (
select row_number()over(order by tempColumn)rownumber,*
from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a
)b
where rownumber>9900结论:
1.max/top,ROW_NUMBER()都是比较不错的分页方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同时适用于sql2000,access。
2.not exists感觉是要比not in效率高一点点。
3.ROW_NUMBER()的3种不同写法效率看起来差不多。
4.ROW_NUMBER() 的变体基于这个测试效率实在不好。
几种常见SQL分页方式
create table pagetest
(
id int identity(1,1) not null,
col01 int null,
col02 nvarchar(50) null,
col03 datetime null
)--分页1,not in/top
select top 50 * from pagetest
where id not in (select top 9900 id from pagetest order by id)
order by id
--分页2,not exists
select top 50 * from pagetest
where not exists
(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)
order by id
--写法3,max/top
select top 50 * from pagetest
where id>(select max(id) from (select top 9900 id from pagetest order by id)a)
order by id
--分页4,row_number()
select top 50 * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900 and rownumber<9951
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber between 9901 and 9950
--分页5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select *
from (
select row_number()over(order by tempColumn)rownumber,*
from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a
)b
where rownumber>9900结论:
1.max/top,ROW_NUMBER()都是比较不错的分页方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同时适用于sql2000,access。
2.not exists感觉是要比not in效率高一点点。
3.ROW_NUMBER()的3种不同写法效率看起来差不多。
4.ROW_NUMBER() 的变体基于这个测试效率实在不好。
sql 分页问题
http://www.builder.com.cn/2007/0912/501756.shtml
在绝大多数的应用中,返回大量的符合条件的记录是司空见惯的,最典型的莫过于搜索了。在搜索的应用中,用户给出搜索条件,服务器查出符合条件的记录。但往往搜索会返回大量的数据记录,如果在网页中,往往是通过分页的方式来实现,页面提供诸如上一页,下一页等等按钮来实现分页。
现在主要有以下几中方式来实现分页:
1.EJB的Find方法
2.在显示第一页前将所有的记录放在collection对象中,后续的各页都在内存中取。
3.每一页都到数据库作一次重复的查询,然后将符合条件的记录显示出来。
4.保存前几页的搜索结果在内存中(经常使用到的),后续的记录(这些数据是多数用户都没有耐心看的)再通过连数据库取得。
5.其他各种cache机制。
我们可以根据实际情况来选择适合自己的方法,我给大家介绍一个通过标准的SQL语句来得到符合条件的数据。如从第10到20条的符合条件(where语句中的)的记录。通过这种方法取得记录有一个必要条件,必须有一个能够标识记录顺序的字段,如id,time等等。下面我为大家演示一个例子:
查询t_table表中所有记录第10到20条,按id排序。
SQL语句为:
SELECT * FROM t_table t1 WHERE (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id ) > = 10 AND (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id ) < 20
又如查询t_table表中key='123'第10到20条的记录,按id排序。
SELECT * FROM t_table t1 WHERE (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id AND t2.key = '123') > = 10 AND (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id AND t2.key = '123') < 20 AND t1.key = '123'
当然条件中的id可以换为任何能标识记录顺序的字段。
http://www.builder.com.cn/2007/0912/501756.shtmlsql 分页问题
http://www.builder.com.cn/2007/0912/501756.shtml
在绝大多数的应用中,返回大量的符合条件的记录是司空见惯的,最典型的莫过于搜索了。在搜索的应用中,用户给出搜索条件,服务器查出符合条件的记录。但往往搜索会返回大量的数据记录,如果在网页中,往往是通过分页的方式来实现,页面提供诸如上一页,下一页等等按钮来实现分页。
现在主要有以下几中方式来实现分页:
1.EJB的Find方法
2.在显示第一页前将所有的记录放在collection对象中,后续的各页都在内存中取。
3.每一页都到数据库作一次重复的查询,然后将符合条件的记录显示出来。
4.保存前几页的搜索结果在内存中(经常使用到的),后续的记录(这些数据是多数用户都没有耐心看的)再通过连数据库取得。
5.其他各种cache机制。
我们可以根据实际情况来选择适合自己的方法,我给大家介绍一个通过标准的SQL语句来得到符合条件的数据。如从第10到20条的符合条件(where语句中的)的记录。通过这种方法取得记录有一个必要条件,必须有一个能够标识记录顺序的字段,如id,time等等。下面我为大家演示一个例子:
查询t_table表中所有记录第10到20条,按id排序。
SQL语句为:
SELECT * FROM t_table t1 WHERE (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id ) > = 10 AND (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id ) < 20
又如查询t_table表中key='123'第10到20条的记录,按id排序。
SELECT * FROM t_table t1 WHERE (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id AND t2.key = '123') > = 10 AND (SELECT count(*) FROM t_table t2 WHERE t2.id < t1.id AND t2.key = '123') < 20 AND t1.key = '123'
当然条件中的id可以换为任何能标识记录顺序的字段。
http://www.builder.com.cn/2007/0912/501756.shtmlsql语句分页详解
这就是一个简单的查询语句,一个语句分为select 与 from 之间的部分,from 与 where之间的部分 和where 后边条件部分。
from 后跟的是表,
你说的a,b就是表名。只不过 是把(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)查询的结果作为表a了。sql语句分页详解
这就是一个简单的查询语句,一个语句分为select 与 from 之间的部分,from 与 where之间的部分 和where 后边条件部分。
from 后跟的是表,
你说的a,b就是表名。只不过 是把(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)查询的结果作为表a了。sql server 求和后如何分页?请看SQL语句
四种方式实现SQLServer
分页查询
SQLServer
的数据分页:
假设现在有这样的一张表:
CREATE
TABLE
test
(
id
int
primary
key
not
null
identity,
names
varchar(20)
)
然后向里面插入大约1000条数据,进行分页测试
假设页数是10,现在要拿出第5页的内容,查询语句如下:
--10代表分页的大小
select
top
10.*
from
test
where
id
not
in
(
--40是这么计算出来的:10*(5-1)
select
top
40
id
from
test
order
by
id
)
order
by
id
原理:需要拿出数据库的第5页,就是40-50条记录。首先拿出数据库中的前40条记录的id值,然后再拿出剩余部分的前10条元素
第二种方法:
还是以上面的结果为例,采用另外的一种方法
--数据的意思和上面提及的一样
select
top
10.*
from
test
where
id
>
(
select
isnull(max(id),0)
from
(
select
top
40
id
from
test
order
by
id
)
A
)
order
by
id
原理:先查询前40条记录,然后获得其最id值,如果id值为null的,那么就返回0
然后查询id值大于前40条记录的最大id值的记录。
这个查询有一个条件,就是id必须是int类型的。
第三种方法:
select
top
10.*
from
(
select
row_number()
over(order
by
id)
as
rownumber,*
from
test
)
A
where
rownumber
>
40
原理:先把表中的所有数据都按照一个rowNumber进行排序,然后查询rownuber大于40的前十条记录
这种方法和oracle中的一种分页方式类似,不过只支持2005版本以上的
第四种:
存储过程查询
创建存储过程
alter
procere
pageDemo
@pageSize
int,
@page
int
AS
declare
@temp
int
set
@temp=@pageSize*(@page
-
1)
begin
select
top
(select
@pageSize)
*
from
test
where
id
not
in
(select
top
(select
@temp)
id
from
test)
order
by
id
end
执行存储过程
exec
10,5
求简单的sql分页语句 最简单 并解释清楚
SQL Server
从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择:
SELECT *
FROM ( SELECT Top N *
FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2
Order by 主键 asc
正确:
SELECT TOP 页大小 *
FROM
Users
WHERE
(ID NOT IN (SELECT TOP (页大小*(页数-1)) ID FROM Users ORDER BY ID ASC))
ORDER BY
ID ASC
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
SELECT *
FROM ( SELECT TOP 20 *
FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2
Order by sys_id asc
My sql数据库
My sql数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:
SELECT * FROM 表名称 LIMIT M,N
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
select * from sys_option limit 10,20求简单的sql分页语句 最简单 并解释清楚
SQL Server
从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择:
SELECT *
FROM ( SELECT Top N *
FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2
Order by 主键 asc
正确:
SELECT TOP 页大小 *
FROM
Users
WHERE
(ID NOT IN (SELECT TOP (页大小*(页数-1)) ID FROM Users ORDER BY ID ASC))
ORDER BY
ID ASC
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
SELECT *
FROM ( SELECT TOP 20 *
FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2
Order by sys_id asc
My sql数据库
My sql数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:
SELECT * FROM 表名称 LIMIT M,N
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
select * from sys_option limit 10,20SQL如何实现数据分页,要具体语句,谢谢
可以的,用存储过程
分页存储过程如下
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部
@Orderfld varchar(255), -- 排序字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType varchar(50) = 'asc', -- 设置排序类型, 非 asc 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(1000) -- 主语句
declare @strTmp varchar(300) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @IsCount != 0 --执行总数统计
begin
if @strWhere != ''
set @strSQL = "select count(*) as Total from [" + @tblName + "] where " + @strWhere
else
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end
else --执行查询操作
begin
if @OrderType != 'asc'
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @Orderfld +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @Orderfld +"] asc"
end
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrder
if @strWhere != ''
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "] where (" + @strWhere + ") "
+ @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder
if @PageIndex = 1
begin
set @strTmp = ""
if @strWhere != ''
set @strTmp = " where (" + @strWhere + ")"
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end
end
exec (@strSQL)SQL如何实现数据分页,要具体语句,谢谢
可以的,用存储过程
分页存储过程如下
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部
@Orderfld varchar(255), -- 排序字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType varchar(50) = 'asc', -- 设置排序类型, 非 asc 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(1000) -- 主语句
declare @strTmp varchar(300) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @IsCount != 0 --执行总数统计
begin
if @strWhere != ''
set @strSQL = "select count(*) as Total from [" + @tblName + "] where " + @strWhere
else
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end
else --执行查询操作
begin
if @OrderType != 'asc'
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @Orderfld +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @Orderfld +"] asc"
end
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrder
if @strWhere != ''
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "] where (" + @strWhere + ") "
+ @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder
if @PageIndex = 1
begin
set @strTmp = ""
if @strWhere != ''
set @strTmp = " where (" + @strWhere + ")"
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end
end
exec (@strSQL)如何用sql语句 实现分页查询?
方法1:
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
)
ORDER BY id
方法2:
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id
方法3:
适用于 SQL Server 2005
SELECT TOP 页大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 页大小*(页数-1)追问你的我看不懂,我自己花了3个小时摸索出来了
追答很强呀,自己摸索出来了