分页查询的sql语句,java中数据库中实现分页的sql语句要求每页十条要查询的是第二页
分页查询的sql语句,java中数据库中实现分页的sql语句要求每页十条要查询的是第二页详细介绍
本文目录一览: 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分页查询的几种方式
TOP(20) * FROM dbo.Message WHERE Code NOT IN(SELECT TOP(10) Code FROM dbo.Message)2:BETWEEN * AND * , Row_Number() OVER(ORDER BY *) AS rowNumSELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM dbo.Message SELECT * FROM #a WHERE rowNum BETWEEN 11 AND 20DROP TABLE #a;3:WITH * AS (),Row_Number() OVER(ORDER BY *) AS rowNumWITH sss AS(SELECT *,ROW_NUMBER() OVER(ORDER BY CreateTime) AS rowNum FROM DBO.Message)SELECT * FROM sss WHERE rowNum BETWEEN 11 AND 204:SQL Server 2012的OFFSET-FETCH筛选SELECT * FROM DBO.Message ORDER BY CreateTime OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY这里第4中方法做详细介绍:TOP选项是一个非常实用的筛选类型,但它有两个缺陷——不是标准SQL,且不支持跳过功能。标准SQL定义的TOP类似筛选称为OFFSET-FETCH,支持跳过功能,这对针对特定页面的查询非常有用。SQL Server2012引入了对OFFSET-FETCH筛选的支持。SQL Server 2012中的OFFSET-FETCH筛选被视为ORDER BY子句的一部分,通常用于实现按顺序显示效果。OFFSET子句指定要跳过的行数,FETCH子句指定在跳过的行数后要筛选的行数。请思考一下下面的查询示例。SELECT orderid, orderdate, custid, empidFROM Sales.OrdersORDER BY orderdate, orderidOFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;此查询按orderdate、orderid顺序(订单日期从最远到最近,并添加了决胜属性(tiebreaker)orderid)排序Orders表中的行。基于此顺序,OFFSET子句跳过前50行,由FETCH子句仅筛选下面的25行。请注意,使用OFFSET-FETCH的查询必须具有ORDER BY子句。此外,FETCH子句不支持没有OFFSET子句。如果你不想跳过任何行,但是希望使用FETCH筛选,你应当使用OFFSET 0 ROWS来表示。不过,没有FETCH的OFFSET是允许的,这种情况是跳过指定的行数,并返回查询结果中所有剩余行。OFFSET-FETCH语法有一些有趣的语言方面需要注意。单数格式ROW和复数格式ROWS是可以互换的,此举是让你能够以直观的类似英语方式来描述筛选。例如,假设你仅希望获取一行,如果你指定了FETCH 1 ROWS,虽然这在语法上是有效的,不过看上去会很怪。因此,你可以使用FETCH 1 ROW格式。此互换同样适用于OFFSET子句。另外,如果你不希望跳过任何行(OFFSET 0 ROWS),你可能觉得“first”比“next”更合适,因此,FIRST和NEXT格式是可以互换的。如你所见,从支持跳过功能看,OFFSET-FETCH子句比TOP子句更灵活。不过,OFFSET-FETCH不支持PERCENT和WITH TIES选项,而TOP支持。由于OFFSET-FETCH是标准的,而TOP不是,我建议使用OFFSET-FETCH作为你的默认选择,除非你需要TOP支持且OFFSET-FETCH不支持的功能。SQL分页查询的几种方式标签:
几种SqlServer2005高效分页sql查询语句
几种sqlserver2005高效sql查询语句top方案:sql codeselect top 10 * from table1where id not in(select top 开始的位置 id from table1)max:sql codeselect top 10 * from table1where id>(select max(id)from (select top 开始位置 id from table1order by id)tt)row:sql codeselect *from ( select row_number()over(order by tempcolumn)temprownumber,* from (select top 开始位置+10 tempcolumn=0,* from table1)t)ttwhere temprownumber>开始位置3种方式,分别是max方案,top方案,row方案效率: 第1:row 第2:max 第3:top缺点: max:必须用户编写复杂sql,不支持非唯一列排序 top:必须用户编写复杂sql,不支持复合主键 row:不支持sqlserver2000测试数据:共320万条数据,每页显示10条数据,分别测试了2万页、15万页和32万页。页码,top方案,max方案,row方案2万,60ms,46ms,33ms15万,453ms,343ms,310ms32万,953ms,720ms,686ms是一种通过程序拼接sql语句的分页方案,用户提过的sql语句不需要编写复杂的sql逻辑诺用户提供sql如下sql codeselect * from table1从第5条开始,查询5条,处理后sql变为sql codeselect *from ( select row_number()over(order by tempcolumn)temprownumber,* from (select top 10 tempcolumn=0,* from table1)t)ttwhere temprownumber>5这是什么意思呢?分解一下首先将用户输入的sql语句转稍稍修改在select后添加top 开始位置+条数变成再外加一列tempcolum,变成这样sql codeselect top 20 tempcolumn=0,* from clazz嵌套一层,这样便可查询出行号刚才那个列就是用来这里order by用的(也不知道sqlserver的row_number函数为什么必须要order by)sql codeselect row_number()over(order by tempcolumn)temprownumber,*from (修改过的查询)t再套一层,过滤掉行号小于开始位置的行sql codeselect * from (第二层)ttwhere temprownumber>10
几条常见的数据库分页SQL语句
作者根据自己使用过的内容,把 常见 数据库 专区 href="http://dev.yesky.com/devsjk" target=_blank> 数据库 Sql Server,Oracle和MySQL的 分页 语句 做了介绍?? 我们在编写MIS系统和Web应用程序等系统时,都涉及到与 数据库 的交互,如果 数据库 中数据量 作者根据自己使用过的内容,把常见数据库专区 href="http://dev.yesky.com/devsjk" target=_blank>数据库Sql Server,Oracle和MySQL的分页语句做了介绍?? 我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,会占用系统很大的资源,因此我们常常采用,需要多少数据就只从数据库中取多少条记录,即采用分页语句。根据自己使用过的内容,把常见数据库Sql Server,Oracle和MySQL的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如下: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例如从表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 ascOralce数据库从数据库表中第M条记录开始检索N条记录SELECT * FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum where t2.r >= M例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum Where t2.R >= 10MySQL数据库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
Oracle常见SQL分页实现方案
在Oracle中 用SQL来实现分页有很多种实现方式 但有些语句可能并不是很通用 只能用在一些特殊场景之中
以下介绍三种比较通用的实现方案 在以下各种实现中 ROWNUM是一个最核心的关键词 在查询时他是一个虚拟的列 取值为 到记录总数的序号
首先来介绍我们工作中最常使用的一种实现方式
SELECT *
FROM (SELECT ROW_ * ROWNUM ROWNUM_
FROM (SELECT *
FROM TABLE
WHERE TABLE _ID = XX
ORDER BY GMT_CREATE DESC) ROW_
WHERE ROWNUM <= )
WHERE ROWNUM_ >= ;
其中最内层的查询SELECT为不进行翻页的原始查询语句 可以用自己的任意Select SQL替换 ROWNUM <= 和ROWNUM >= 控制分页查询的每页的范围
分页的目的就是控制输出结果集大小 将结果尽快的返回 上面的SQL语句在大多数情况拥有较高的效率 主要体现在WHERE ROWNUM <= 这句上 这样就控制了查询过程中的最大记录数
上面例子中展示的在查询的第二层通过ROWNUM <= 来控制最大值 在查询的最外层控制最小值 而另一种方式是去掉查询第二层的WHERE ROWNUM <= 语句 在查询的最外层控制分页的最小值和最大值 此时SQL语句如下 也就是要介绍的第二种实现方式
SELECT *
FROM (SELECT A * ROWNUM RN
FROM (SELECT *
FROM TABLE
WHERE TABLE _ID = XX
ORDER BY GMT_CREATE DESC) A)
WHERE RN BEEEN AND ;
由于Oracle可以将外层的查询条件推到内层查询中 以提高内层查询的执行效率 但不能跨越多层
对于第一个查询语句 第二层的查询条件WHERE ROWNUM <= 就可以被Oracle推入到内层查询中 这样Oracle查询的结果一旦超过了ROWNUM限制条件 就终止查询将结果返回了
而 第二个查询语句 由于查询条件BEEEN AND 是存在于查询的第三层 而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义 因为最内层查询不知道RN代表什么) 因此 对于第二个查询语句 Oracle最内层返回给中间层的是所有满足条件的数据 而中间层返回给最外层的也是所有数据 数据的过滤在最外层完成 显然这个效率要比第一个查询低得多
以上两种方案完全是通过ROWNUM来完成 下面一种则采用ROWID和ROWNUM相结合的方式 SQL语句如下
SELECT *
FROM (SELECT RID
FROM (SELECT R RID ROWNUM LINENUM
FROM (SELECT ROWID RID
FROM TABLE
WHERE TABLE _ID = XX
ORDER BY GMT_CREATE DESC) R
WHERE ROWNUM <= )
WHERE LINENUM >= ) T
TABLE T
WHERE T RID = T ROWID;
从语句上看 共有 层Select嵌套查询 最内层为可替换的不分页原始SQL语句 但是他查询的字段只有ROWID 而没有任何待查询的实际表字段 具体查询实际字段值是在最外层实现的
这种方式的原理大致为 首先通过ROWNUM查询到分页之后的 条实际返回记录的ROWID 最后通过ROWID将最终返回字段值查询出来并返回
和前面两种实现方式相比 该SQL的实现方式更加繁琐 通用性也不是非常好 因为要将原始的查询语句分成两部分(查询字段在最外层 表及其查询条件在最内层)
但这种实现在特定场景下还是有优势的 比如我们经常要翻页到很后面 比如 条记录中我们经常需要查 及其以后的数据 此时该方案效率可能要比前面的高
因为前面的方案中是通过ROWNUM <= 来控制的 这样就需要查询出 条数据 然后取最后 之间的数据 而这个方案直接通过ROWID取需要的那 条数据
从不断向后翻页这个角度来看 第一种实现方案的成本会越来越高 基本上是线性增长 而第三种方案的成本则不会像前者那样快速 他的增长只体现在通过查询条件读取ROWID的部分
当然 除了以上提了这些方案 我们还可以用以下的SQL来实现
SELECT *
FROM TABLE
WHERE TABLE _ID NOT IN
(SELECT TABLE _ID FROM TABLE WHERE ROWNUM <= )
AND ROWNUM <= ;
SELECT *
FROM TABLE
WHERE ROWNUM <=
MINUS
SELECT * FROM TABLE WHERE ROWNUM <= ;
………………
注意 当ROWNUM作为查询条件时 他是在order by之前执行 所以要特别小心
比如我们想查询TABLE 中按TABLE _ID倒序排列的前 条记录不能用如下的SQL来完成
lishixinzhi/Article/program/Oracle/201311/11198
java中数据库中实现分页的sql语句要求每页十条要查询的是第二页
1、首先preparedstatement是statement的子接口,属于预处理操作,与直接使用statement不同的是,preparedstatement在操作的时候,先在数据表中准备好了一条sql语句,但是sql语句的值暂时不设置,而是之后设置。
2、在使用statement的时候,要执行一条完整的失去了,在执行钱使用connection直接创建的。
3、如何获得preparedstatement,在connection接口中,通过preparedstatement(String sql)得到。
4、最后在日期输入的时候,正常情况都是使用java.util.date表示日期,在 preparedStatement中需要使用java.sql.date类型,如下图所示就完成了。
利用SQL语句对不同数据库进行高效果分页[2]
Oracle数据库
因为Oracle数据库没有Top关键字 所以这里就不能够像微软的数据据那样操作 这里有两种方法
( ) 一种是利用相反的
PAGESIZE 每页显示的记录数 CURRENTPAGE 当前页号
数据表的名字是 ponents 索引主键字是 id
select * from ponents where id not in(select id from ponents where rownum<=(PAGESIZE*(CURRENTPAGE ))) and rownum<=PAGESIZE order by id;
如下例
select * from ponents where id not in (select id from ponents where rownum<= ) and rownum<= order by id;
从 到记录开始选择 选择前面 条
( ) 使用minus 即中文的意思就是减去
select * from ponents where rownum <=(PAGESIZE*(CURRENTPAGE )) minus select * from ponents where rownum <=(PAGESIZE*(CURRENTPAGE )); 如例 select * from ponents where rownum<= minus select * from ponents where rownum<= ;
( ) 一种是利用Oracle的rownum 这个是Oracle查询自动返回的序号 一般不显示 但是可以通过select rownum from [表名]看到 注意 它是从 到当前的记录总数
select * from (select rownum tid ponents * from ponents where rownum<= ) where tid<= ;
lishixinzhi/Article/program/SQL/201311/16223
【SQL语句】-分页查询limit的用法
select * from table limit 索引 , 查询的数据个数
select grade from Student limit 5,1。表示:从第6行或者第6页开始查询(包括第6行),往后查一行数据,结果是 6.
?select * from Customer limit 10 ;--检索前10行数据,显示1-10条数据
=select * from Customer? limit ?0,10 --0可以省略
select * from Customer limit 5,10 ;--检索从第6行开始向后加10条数据,共显示id为6,7....15
查询从某一行开始到结尾的全部数据,可以在第二个参数中设置一个很大的值
如:查询从第3行开始的后面全部数据
select * from table limit 2,99999999999999999999999999;
扩展:
limit典型的应用场景就是实现分页查询
已知:每页显示m条数据,求:显示第n页的数据
select * from table limit? (n-1)m,m
如何用sql语句 实现分页查询?
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
方法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)