數據分頁往往有三種常用方案。 第一種,把資料庫中存放的相關數據,全部讀入PHP/Java/C#代碼/記憶體,再由代碼對其進行分頁操作(速度慢,簡易性高)。 第二種,直接在資料庫中對相關數據進行分頁操作,再把分頁後的數據輸出給代碼程式(速度中,簡易性中)。 第三種,先把資料庫中的相關數據全部讀入“緩存” ...
數據分頁往往有三種常用方案。
第一種,把資料庫中存放的相關數據,全部讀入PHP/Java/C#代碼/記憶體,再由代碼對其進行分頁操作(速度慢,簡易性高)。
第二種,直接在資料庫中對相關數據進行分頁操作,再把分頁後的數據輸出給代碼程式(速度中,簡易性中)。
第三種,先把資料庫中的相關數據全部讀入“緩存”或第三方工具,再由代碼程式對“緩存”或第三方工具中的數據進行讀取+分頁操作(速度快,簡易性差)。
本文下麵重點闡述上述【第二種】方案在SQL Server上的使用(其它種類資料庫由於Sql語句略有差異,所以需要調整,但方案也類似)
1、ROW_NUMBER() OVER()方式(SQL2012以下推薦使用)
示例:
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY menuId) AS RowId,* FROM sys_menu ) AS r
WHERE RowId BETWEEN 1 AND 10
用子查詢新增一列行號(ROW_NUMBER)RowId查詢,比較高效的查詢方式,只有在SQL Server2005或更高版本才支持。
BETWEEN 1 AND 10 是指查詢第1到第10條數據(閉區間),在這裡面需要註意的是OVER的括弧裡面可以寫多個排序欄位。
通用用法
--pageIndex 表示指定頁
--pageSize 表示每頁顯示的條數
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY 排序欄位) AS RowId,* FROM 表名 ) AS r
WHERE RowId BETWEEN ((pageIndex-1)*pageSize + 1) AND (pageIndex * PageSize)
2、offset fetch next方式(SQL2012及以上的版本才支持:推薦使用 )
示例:
--offset fetch next方式查詢,最高效的查詢方式,只有在SQL Server2012或更高版本才支持
SELECT * FROM sys_menu
ORDER BY menuId offset 0 ROWS FETCH NEXT 10 ROWS ONLY
offset 是跳過多少行,
next是取接下來的多少行,
句式 offset...rows fetch nect ..rows only ,註意rows和末尾的only 不要寫漏掉了,並且這種方式必須要接著Order by XX 使用,不然會報錯。
通用用法
--pageIndex 表示指定頁
--pageSize 表示每頁顯示的條數
SELECT * FROM 表名
ORDER BY 排序欄位 offset ((pageIndex - 1) * pageSize) ROWS FETCH NEXT pageSize ROWS ONLY
3、top not in方式 (不推薦)
示例:
--查詢第11-20條記錄
SELECT TOP 10 menuId, *
FROM sys_menu
WHERE menuId NOT IN (SELECT TOP 10 menuId FROM sys_menu)
這條語句的原理是先查詢1-10條記錄的ID,然後再查詢ID不屬於這1-10條記錄的ID,並且只需要10條記錄,因為每頁大小就是10,
這就是獲取到的第11-20條記錄,這是非常簡單的一種寫法。
另外IN語句與NOT IN語句類似,這是NOT IN的寫法,但是這種寫法數據量大的話效率太低。
通用用法
--pageIndex 表示指定頁
--pageSize 表示每頁顯示的條數
SELECT TOP pageSize menuId, *
FROM sys_menu
WHERE menuId NOT IN (SELECT TOP ((pageSize-1)*pageIndex) menuId FROM sys_menu)
4、通過升序與降序方式進行查詢分頁(不推薦)
示例:
--查詢第11-20條記錄
SELECT * FROM(
SELECT TOP 10 * FROM(
SELECT TOP 20 * FROM sys_menu ORDER BY menuId ASC)
AS TEMP1 ORDER BY menuId DESC)
AS TEMP2 ORDER BY menuId ASC
這條語句首先查詢前20條記錄,然後在倒序查詢前10條記錄(即倒數10條記錄),
這個時候就已經獲取到了11-20條記錄,但是他們的順序是倒序,所以最後又進行升序排序。
通用方法
--pageIndex 表示指定頁
--pageSize 表示每頁顯示的條數
SELECT * FROM(
SELECT TOP pageSize * FROM(
SELECT TOP ((pageIndex - 1) * pageSize +(pageSize*2)) * FROM sys_menu ORDER BY menuId ASC)
AS TEMP1 ORDER BY menuId DESC)
AS TEMP2 ORDER BY menuId ASC
5、採用MAX(ID)或者MIN(ID)函數(不推薦)
示例:
--查詢第11-20條記錄