高效的SQLSERVER分页查询(推荐)
第一种方案、最简单、普通的具体相关方法:,复制具体相关代码 具体相关代码如下:,SELECT TOP 30 * FROM ARTICLE WhERE ID NOT IN(SELECT TOP 45000 ID FROM ARTICLE ORDER BY YEAR DESC, ID,平均查询100次所需时间:45s,第二种方案:,复制具体相关代码 具体相关代码如下:,SELECT * FROM ( SELECT TOP 30 * FROM (SELECT TOP 45030 * FROM ARTICLE ORDER BY YEAR DESC, ID DESC) ,平均查询100次所需时间:138S,第三种方案:,复制具体相关代码 具体相关代码如下:,SELECT * FROM ARTICLE w1, ( SELECT TOP 30 ID FROM ( SELECT TOP 50030 ID, YEAR FROM ARTICLE ORDER BY ,平均查询100次所需时间:21S,第四种方案:,复制具体相关代码 具体相关代码如下:,SELECT * FROM ARTICLE w1 WhERE ID in ( SELECT top 30 ID FROM ( SELECT top 45030 ID, YEAR FROM ARTICL,平均查询100次所需时间:20S,第五种方案:,复制具体相关代码 具体相关代码如下:,SELECT w2.n, w1.* FROM ARTICLE w1, ( SELECT TOP 50030 row_number() OVER (ORDER BY YEAR DESC, ID DES,平均查询100次所需时间:15S,查询第1000-1030条记录,第一种方案:,复制具体相关代码 具体相关代码如下:,SELECT TOP 30 * FROM ARTICLE WhERE ID NOT IN(SELECT TOP 1000 ID FROM ARTICLE ORDER BY YEAR DESC, ID ,平均查询100次所需时间:80s,第二种方案:,复制具体相关代码 具体相关代码如下:,SELECT * FROM ( SELECT TOP 30 * FROM (SELECT TOP 1030 * FROM ARTICLE ORDER BY YEAR DESC, ID DESC) ,平均查询100次所需时间:30S,第三种方案:,复制具体相关代码 具体相关代码如下:,SELECT * FROM ARTICLE w1, ( SELECT TOP 30 ID FROM ( SELECT TOP 1030 ID, YEAR FROM ARTICLE ORDER BY Y,平均查询100次所需时间:12S,第四种方案:,复制具体相关代码 具体相关代码如下:,SELECT * FROM ARTICLE w1 WhERE ID in ( SELECT top 30 ID FROM ( SELECT top 1030 ID, YEAR FROM ARTICLE,平均查询100次所需时间:13S,第五种方案:,复制具体相关代码 具体相关代码如下:,SELECT w2.n, w1.* FROM ARTICLE w1,( SELECT TOP 1030 row_number() OVER (ORDER BY YEAR DESC, ID DESC,平均查询100次所需时间:14S,由此可见在查询页数靠前时,效率3>4>5>2>1,页码靠后时5>4>3>1>2,再根据用户习惯,一般用户的检索只看最前面几页,因此选择3 4 5方案均可,若综合考虑方案5是最好的选择,但是要注意SQL,以下是根据第四种方案编写的一个分页存储过程:,复制具体相关代码 具体相关代码如下:,if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]') and OBJECTPROPE,CREATE PROCEDURE [dbo].[sys_Page_v2] @PCount int output, --总页数输出 @RCount int output, --总记录数输出 @sys_T,SET NOCOUNT ON SET ANSI_WARNINGS ON,IF @sys_PageSize < 0 OR @sys_PageIndex < 0 BEGIN RETURN END,DECLARE @new_where1 NVARChAR(3000) DECLARE @new_order1 NVARChAR(100) DECLARE @new_order2 NVARChAR(10,DECLARE @Top int,if(@sys_Begin <=0) set @sys_Begin=0 else set @sys_Begin=@sys_Begin-1,IF ISNULL(@sys_Where,'') = '' SET @new_where1 = ' ' ELSE SET @new_where1 = ' WhERE ' @sys_Where,IF ISNULL(@sys_Order,'') <> '' BEGIN SET @new_order1 = ' ORDER BY ' Replace(@sys_Order,'desc','') ,SET @new_order2 = ' ORDER BY ' @sys_Order END ELSE BEGIN SET @new_order1 = ' ORDER BY ID DESC' SET,SET @SqlCount = 'SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1) 0.0)/' CAST(@sys_PageSize AS NV,EXEC SP_EXECUTESQL @SqlCount,N'@RCount INT OUTPUT,@PCount INT OUTPUT', @RCount OUTPUT,@PCount OUTPUT,IF @sys_PageIndex > CEILING((@RCount 0.0)/@sys_PageSize) --假如如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数 BEGIN SET,set @sql = 'select ' @sys_fields ' from ' @sys_Table ' w1 ' ' where ' @sys_Key ' in (' 's,print(@sql),Exec(@sql),GO,
一、不用where 1=1 在多条件查询中的困扰
举个例子,假如如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询数据库语句的动态构造,具体相关代码大体如下:
复制具体相关代码 具体相关代码如下:
string MySqlStr=”select * from table where”;
if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr “Age=“ “'Age.Text'“;
}
if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr “and Address=“ “'Address.Text'“;
}
①种假设
假如如果上述的两个IF判断数据库语句,均为True,即用户都输入了查询词,那么,最终的MySqlStr动态构造数据库语句变为:
复制具体相关代码 具体相关代码如下:
MySqlStr=”select * from table where Age='18' and Address='云南省文山州广南县小波吗村'”
可以看得出来,这是一条完整的正确的SQL查询数据库语句,能够正确的被执行,并根据网站数据库是否存在记录,返回数据。
②种假设
假如如果上述的两个IF判断数据库语句不成立,那么,最终的MySqlStr动态构造数据库语句变为:
复制具体相关代码 具体相关代码如下:
MySqlStr=”select * from table where“
现在,咱们来看一下这条数据库语句,由于where关键词后面需要使用条件,但是这条数据库语句根本就不存在条件,所以,该数据库语句就是一条错误的数据库语句,肯定不能被执行,不仅报错,同时还不会查询到任何数据。
上述的两种假设,代表了现实的应用,说明,数据库语句的构造存在问题,不足以应付灵活多变的查询条件。
二、使用 where 1=1 的好处
假如咱们将上述的数据库语句改为:
复制具体相关代码 具体相关代码如下:
string MySqlStr=”select * from table where 1=1 ”;
if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr “and Age=“ “'Age.Text'“;
}
if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr “and Address=“ “'Address.Text'“;
}
现在,也存在两种假设
①种假设
假如如果两个IF都成立,那么,数据库语句变为:
复制具体相关代码 具体相关代码如下:
MySqlStr=”select * from table where 1=1 and Age='18' and Address='云南省文山州广南县小波吗村'”,很明显,该数据库语句是一条正确的数据库语句,能够正确执行,假如如果网站数据库有记录,肯定会被查询到。
②种假设
假如如果两个IF都不成立,那么,数据库语句变为:
MySqlStr=”select * from table where 1=1”,现在,咱们来看这条数据库语句,由于where 1=1 是为True的数据库语句,因此,该条数据库语句语法正确,能够被正确执行,它的作用相当于:
MySqlStr=”select * from table”,即返回表中所有数据。
言下之意就是:假如如果用户在多条件查询页面中,不选择任何字段、不输入任何关键词,那么,必将返回表中所有数据;假如如果用户在页面中,选择了部分字段并且输入了部分查询关键词,那么,就按用户设置的条件进行查询。
说到这里,不知道您是否已明白,其实,where 1=1的应用,不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL数据库语句的一种具体相关方法。
where 1=0; 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表
复制具体相关代码 具体相关代码如下:
"SELECT * FROM strName WhERE 1 = 0";
该select数据库语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。
复制具体相关代码 具体相关代码如下:
create table newtable as select * from oldtable where 1=0; 创建一个新表,而新表的结构与查询的表的结构是一样的。