因為數據量過大,如果一次性查詢會耗用大量時間以及性能,因此對數據進行分頁顯示變得尤為重要,以下就列出一些常用數據庫的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