国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

MSSQL MySQL 數(shù)據(jù)庫(kù)分頁(yè)(存儲(chǔ)過(guò)程)

2024-07-24 12:43:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
先看看單條 SQL 語(yǔ)句的分頁(yè) SQL 吧。

方法1:
適用于 SQL Server 2000/2005

復(fù)制代碼 代碼如下:


SELECT TOP 頁(yè)大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 頁(yè)大小*(頁(yè)數(shù)-1) id FROM table1 ORDER BY id
)
ORDER BY id


方法2:
適用于 SQL Server 2000/2005

復(fù)制代碼 代碼如下:


SELECT TOP 頁(yè)大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 頁(yè)大小*(頁(yè)數(shù)-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id


方法3:
適用于 SQL Server 2005

復(fù)制代碼 代碼如下:


SELECT TOP 頁(yè)大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 頁(yè)大小*(頁(yè)數(shù)-1)


方法4:
適用于 SQL Server 2005

復(fù)制代碼 代碼如下:


row_number() 必須制定 order by ,不指定可以如下實(shí)現(xiàn),但不能保證分頁(yè)結(jié)果正確性,因?yàn)榕判虿灰欢煽俊?赡艿谝淮尾樵?xún)記錄A在第一頁(yè),第二次查詢(xún)又跑到了第二頁(yè)。
declare @PageNo int ,@pageSize int;
set @PageNo = 2
set @pageSize=20
select * from (
select row_number() over(order by getdate()) rn,* from sys.objects)
tb where rn >(@PageNo-1)*@pageSize and rn <=@PageNo*@pageSize


還有一種方法就是將排序字段作為變量,通過(guò)動(dòng)態(tài)SQL 實(shí)現(xiàn),可以改成存儲(chǔ)過(guò)程。

復(fù)制代碼 代碼如下:


declare @PageNo int ,@pageSize int;
declare @TableName varchar(128),@OrderColumns varchar(500), @SQL varchar(max);
set @PageNo = 2
set @pageSize=20
set @TableName = 'sys.objects'
set @OrderColumns = 'name ASC,object_id DESC'
set @SQL = 'select * from (
select row_number() over(order by '+@OrderColumns+' ) rn,* from ' +@TableName+')tb where rn >'+convert(varchar(50),(@PageNo-1)*@pageSize) +' and rn <= '+convert(varchar(50),@PageNo*@pageSize)
print @SQL
exec(@SQL)


方法5:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))
適用于 SQL Server 2005

復(fù)制代碼 代碼如下:


create procedure SqlPager
@sqlstr nvarchar(4000), --查詢(xún)字符串
@currentpage int, --第N頁(yè)
@pagesize int --每頁(yè)行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁(yè)數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁(yè)
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off


方法5:(利用MySQL的limit)
適用于 MySQL
mysql中l(wèi)imit的用法詳解[數(shù)據(jù)分頁(yè)常用]
在我們使用查詢(xún)語(yǔ)句的時(shí)候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù),這個(gè)時(shí)候怎么辦呢?不用擔(dān)心,mysql已經(jīng)為我們提供了這樣一個(gè)功能。

復(fù)制代碼 代碼如下:


select * from table limit [offset,] rows | rows offset offset
limit 子句可以被用于強(qiáng)制 select 語(yǔ)句返回指定的記錄數(shù)。limit 接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)整數(shù)常量。如果給定兩個(gè)參數(shù),第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。初 始記錄行的偏移量是 0(而不是 1): 為了與 postgresql 兼容,mysql 也支持句法: limit # offset #。
mysql> select * from table limit 5,10; // 檢索記錄行 6-15
//為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為 -1:
mysql> select * from table limit 95,-1; // 檢索記錄行 96-last.
//如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目:
mysql> select * from table limit 5; //檢索前 5 個(gè)記錄行
//換句話(huà)說(shuō),limit n 等價(jià)于 limit 0,n。
1. select * from tablename <條件語(yǔ)句> limit 100,15
從100條記錄后開(kāi)始取15條 (實(shí)際取取的是第101-115條數(shù)據(jù))
2. select * from tablename <條件語(yǔ)句> limit 100,-1
從第100條后開(kāi)始-最后一條的記錄
3. select * from tablename <條件語(yǔ)句> limit 15
相當(dāng)于limit 0,15 .查詢(xún)結(jié)果取前15條數(shù)據(jù)
說(shuō)明,頁(yè)大小:每頁(yè)的行數(shù);頁(yè)數(shù):第幾頁(yè)。使用時(shí),請(qǐng)把"頁(yè)大小"和"頁(yè)大小*(頁(yè)數(shù)-1)"替換成數(shù)字。


其它的方案:如果沒(méi)有主鍵,可以用臨時(shí)表,也可以用方案三做,但是效率會(huì)低。
建議優(yōu)化的時(shí)候,加上主鍵和索引,查詢(xún)效率會(huì)提高。

通過(guò)SQL 查詢(xún)分析器,顯示比較:我的結(jié)論是:
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))效率最高,需要拼接SQL語(yǔ)句
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè)) 效率次之,需要拼接SQL語(yǔ)句
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè)) 效率最差,但是最為通用
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大埔区| 满洲里市| 西乌| 古浪县| 巨鹿县| 监利县| 九江市| 铁岭市| 开平市| 西和县| 宣化县| 大英县| 固始县| 龙游县| 富裕县| 江城| 手游| 凯里市| 大同市| 宜兴市| 宜君县| 绥化市| 灌南县| 天台县| 汉寿县| 黎平县| 石门县| 石狮市| 江永县| 洮南市| 凉山| 佛坪县| 龙州县| 沁阳市| 阿鲁科尔沁旗| 拜城县| 鹿邑县| 贵溪市| 黄骅市| 南雄市| 兴仁县|