×

sql分页查询关键字

sql分页查询关键字(用SQL写出分页查询)

admin admin 发表于2023-11-07 09:35:04 浏览34 评论0

抢沙发发表评论

本文目录

用SQL写出分页查询

SELECT * FROM(SELECT A.*, ROWNUM RNFROM (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 RNFROM (SELECT * FROM TABLE_NAME) AWHERE 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 RNFROM (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 RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM 《= 40)WHERE RN 》= 21

sql语句查询加分页

你的意思是前五行是固定的,后十行进行分页是么,前五行固定写死,后十行用参数或动态sql来进行分页。例如第一页:select top 5 id,readcount,weight from table1 order by readcount descunion allselect top 10,id,readcount,weight from table1 order by weight desc --这句进行动态sql或传参数进行分页,网上分页的sql很多。有问题再追问。

求MS-SQL根据关键字查询的匹配度进行排序分页的存储过程

/* Function: SuperPaging* Description:* 超强通用分页存储过程 * Example:* SuperPaging @TableName=’表名’,@Orderfld=’排序列名’ */CREATE PROCEDURE SupesoftPage(@TableName nvarchar(50), -- 表名@ReturnFields nvarchar(2000) = ’*’, -- 需要返回的列 @PageSize int = 10, -- 每页记录数@PageIndex int = 1, -- 当前页码@Where nvarchar(2000) = ’’, -- 查询条件@Orderfld nvarchar(2000), -- 排序字段名 最好为唯一主键@OrderType int = 1 -- 排序类型 1:降序 其它为升序)ASDECLARE @TotalRecord intDECLARE @TotalPage intDECLARE @CurrentPageSize intDECLARE @TotalRecordForPageIndex intDECLARE @OrderBy nvarchar(255)DECLARE @CutOrderBy nvarchar(255)if @OrderType = 1BEGINset @OrderBy = ’ Order by ’ + REPLACE(@Orderfld,’,’,’ desc,’) + ’ desc ’set @CutOrderBy = ’ Order by ’+ REPLACE(@Orderfld,’,’,’ asc,’) + ’ asc ’ENDelseBEGINset @OrderBy = ’ Order by ’ + REPLACE(@Orderfld,’,’,’ asc,’) + ’ asc ’set @CutOrderBy = ’ Order by ’+ REPLACE(@Orderfld,’,’,’ desc,’) + ’ desc ’ END-- 记录总数declare @countSql nvarchar(4000) set @countSql=’SELECT @TotalRecord=Count(*) From ’+@TableName+’ ’+@Whereexecute sp_executesql @countSql,N’@TotalRecord int out’,@TotalRecord outSET @TotalPage=(@TotalRecord-1)/@PageSize+1SET @CurrentPageSize=@PageSizeIF(@TotalPage=@PageIndex)BEGINSET @CurrentPageSize=@TotalRecord%@PageSizeIF(@CurrentPageSize=0)SET @CurrentPageSize=@PageSizeEND-- 返回记录set @TotalRecordForPageIndex=@PageIndex*@PageSizeexec(’SELECT * FROM(SELECT TOP ’+@CurrentPageSize+’ * FROM(SELECT TOP ’+@TotalRecordForPageIndex+’ ’+@ReturnFields+’FROM ’+@TableName+’ ’+@Where+’ ’+@OrderBy+’) TB2’+@CutOrderBy+’) TB3’+@OrderBy)-- 返回总页数和总记录数SELECT @TotalPage as PageCount,@TotalRecord as RecordCountGO

sql 分页多条件查询

查询可以用if else 去做。例如:sql=“select * from .........“``````````````xh=request(“型号“)······if xh《》““ then sql=sql+“ and 型号=’“&xh&“’“分页可以用《%TurnPage(rs,20,“型号=“&xh&“&其他6个参数·······“)%》《%Sub TurnPage(ByRef Rs_tmp,PageSize,canshu) ’Rs_tmp 记录集 PageSize 每页显示的记录条数; Dim TotalPage ’总页数 Dim PageNo ’当前显示的是第几页 Dim RecordCount ’总记录条数 Rs_tmp.PageSize = PageSize RecordCount = Rs_tmp.RecordCount TotalPage = INT(RecordCount / PageSize * -1)*-1 PageNo = Request.QueryString (“PageNo“) ’直接输入页数跳转; If Request.Form(“PageNo“)《》““ Then PageNo = Request.Form(“PageNo“) ’如果没有选择第几页,则默认显示第一页; If PageNo = ““ then PageNo = 1 If RecordCount 《》 0 then Rs_tmp.AbsolutePage = PageNo End If ’获取当前文件名,使得每次翻页都在当前页面进行; Dim fileName,postion fileName = Request.ServerVariables(“script_name“) postion = InstrRev(fileName,“/“)+1 ’取得当前的文件名称,使翻页的链接指向当前文件; fileName = Mid(fileName,postion) response.write “《table border=0 width=’100%’》《tr》 “If RecordCount = 0 or TotalPage = 1 Then Response.Write ““ Elseresponse.write “《td align=left style=’font-size:12px’》 总页数:《font color=#ff3333》“&TotalPage&“《/font》页“response.write “当前第《font color=#ff3333》“&PageNo&“《/font》页 《/td》 “response.write “《td align=’right’ style=’font-size:12px’》 “end ifIf RecordCount = 0 or TotalPage = 1 Then Response.Write ““ Else response.write “《a href=’“&fileName&“?PageNo=1&“&canshu&“’》首页|《/a》“ If PageNo - 1 = 0 Then Response.Write “前页|“ Else response.write “《a href=’“&fileName&“?PageNo=“&PageNo-1&“&“&canshu&“’》前页|《/a》“ End If If PageNo+1 》 TotalPage Then Response.Write “后页|“ Else response.write “《a href=’“&fileName&“?PageNo=“&PageNo+1&“&“&canshu&“’》后页|《/a》“ End If response.write “《a href=’“&fileName&“?PageNo=“&TotalPage&“&“&canshu&“’》末页《/a》“End Ifresponse.write “《/td》《/td》《/tr》《/table》 “end sub%》