各種常見數據庫分頁實現(轉)


 

因為數據量過大,如果一次性查詢會耗用大量時間以及性能,因此對數據進行分頁顯示變得尤為重要,以下就列出一些常用數據庫的sql分頁實現。 

1.MySQL實現分頁 
MySQL實現分頁效果比較簡單,只有一個limit關鍵字就可以解決。 

示例:SELECT username,password FROM tb_user WHERE id = 1 LIMIT 100,10; 
具體:select * from tableName where 條件 limit 當前頁碼*頁面容量-1,頁面容量 

2.Oralce實現分頁 

SELECT * 
  FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM tableName order by id) A WHERE ROWNUM <=20) 
WHERE RN >= 11; 

select count(*) from tableName where 條件 


3.Sqlserver實現分頁 

sqlserver由於版本的不同,分頁的實現方式也各不相同。 

SQL 2000 用臨時表解決,通過在臨時表中增加自增列解決RowNumber。 
DECLARE @Start INT 
DECLARE @End INT 
SELECT @Start = 14000,@End = 14050 

CREATE TABLE #employees (RowNumber INT IDENTITY(1,1), 
LastName VARCHAR(100),FirstName VARCHAR(100), 
EmailAddress VARCHAR(100)) 

INSERT INTO #employees (LastName, FirstName, EmailAddress) 
SELECT LastName, FirstName, EmailAddress 
FROM Employee 
ORDER BY LastName, FirstName, EmailAddress 
SELECT LastName, FirstName, EmailAddress 
FROM #employees 
WHERE RowNumber > @Start AND RowNumber <= @End 

DROP TABLE #employees 

GO   

SQL 2005/2008 由於支持了Row_Number於是通過派生表的方式解決(兩個嵌套) 
DECLARE @Start INT 
DECLARE @End INT 
SELECT @Start = 14000,@End = 14050 

SELECT LastName, FirstName, EmailAddress 
FROM (SELECT LastName, FirstName, EmailAddress, 
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber 
FROM Employee) EmployeePage 
WHERE RowNumber > @Start AND RowNumber <= @End 
ORDER BY LastName, FirstName, EmailAddress 
GO 
   

SQL 2005/2008 或者用CTE的方式實現,和派生表一樣,就是好看點,執行計划都一樣。 
DECLARE @Start INT 
DECLARE @End INT 
SELECT @Start = 14000,@End = 14050; 
WITH EmployeePage AS 
(SELECT LastName, FirstName, EmailAddress, 
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber 
FROM Employee) 
SELECT LastName, FirstName, EmailAddress 
FROM EmployeePage 
WHERE RowNumber > @Start AND RowNumber <= @End 
ORDER BY LastName, FirstName, EmailAddress 
GO 
   
SQL SERVER 2012 比較給力支持了OFFSET,於是一個Select結束戰斗,另外在2012里,如果前面加上TOP(50),那么執行計划就會少讀很多行數據(讀的精准了),提高性能。 
SELECT top(50) LastName, FirstName, EmailAddress 
FROM Employee 
ORDER BY LastName, FirstName, EmailAddress 
OFFSET 14000 ROWS 
FETCH NEXT 50 ROWS ONLY; 

4.DB2實現分頁 
Db2實現分頁與SQL Server類似, 但是可以不對資料排序(起始位置從1開始) 

對資料排序 
select * from ( 
    select t.*, ROW_NUMBER() OVER(ORDER BY CARD_ID asc) AS ROWNUM from CARD t ) a 
where ROWNUM > 20 and ROWNUM <=30 

不對資料排序 
select * from ( 
    select t.*, ROW_NUMBER() OVER() AS ROWNUM from CARD t ) a 
where ROWNUM > 20 and ROWNUM <=30 


以上為各種常見數據庫分頁語句,留存備用。

http://lafecat.iteye.com/blog/2186265

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM