mysql、MS SQL關於分頁的sql查詢語句 limit 和row_number() OVER函數


在做項目的時候需要些分頁,用的數據庫MySQL,之前看到的參考例子是用MS SQL做的,在MS SQL、Oracle里面有ROW_NUMBER() OVER函數可以在數據庫里對數據進行分組。百度后的結論總結如下:

(一)先說下在mysql里面分頁時的sql語句,轉載自http://topic.csdn.net/u/20090504/15/bfbc217b-4ae4-4f36-9810-21de077fb034.html第13、14樓:

MySQL中的分頁比較容易,只要在程序中中得到是從哪條記錄開始,需要取多少個記錄就行了。

比如頁長 10, 那么第8頁就是自 第81 條記錄取10條,語句類似於:

select * from tbl_user order by c_uid limit 80,10


limit 的用法,可以參考MySQL的官方文檔說明。
http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select
13.2.7. SELECT語法

LIMIT子句可以被用於限制被SELECT語句返回的行數。LIMIT取一個或兩個數字自變量,自變量必須是非負的整數常數(當使用已預備的語句時除外)。

使用兩個自變量時,第一個自變量指定返回的第一行的偏移量,第二個自變量指定返回的行數的最大值。初始行的偏移量為0(不是1):

mysql> SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15為了與PostgreSQL兼容,MySQL也支持LIMIT row_count OFFSET offset語法。

如果要恢復從某個偏移量到結果集合的末端之間的所有的行,您可以對第二個參數是使用比較大的數。本語句可以恢復從第96行到最后的所有行:

mysql> SELECT * FROM tbl LIMIT 95,18446744073709551615;

使用1個自變量時,該值指定從結果集合的開頭返回的行數:

mysql> SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

換句話說,LIMIT n與LIMIT 0,n等價。

對於已預備的語句,您可以使用位置保持符。以下語句將從tb1表中返回一行:

mysql> SET @a=1;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;

以下語句將從tb1表中返回第二到第六行:

mysql> SET @skip=1; SET @numrows=5;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;

 

(二)在MS SQL里面,有ROW_NUMBER() OVER函數:

轉載自http://www.cnblogs.com/fxgachiever/archive/2010/09/15/1826792.html

 

語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

簡單的說row_number()從1開始,為每一條分組記錄返回一個數字,這里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再為降序以后的沒條xlh記錄返回一個序號。
示例:
xlh           row_num
1700              1
1500              2
1085              3
710                4

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)

實例:

初始化數據

create table employee (empid int ,deptid int ,salary decimal(10,2))
insert into employee values(1,10,5500.00)
insert into employee values(2,10,4500.00)
insert into employee values(3,20,1900.00)
insert into employee values(4,20,4800.00)
insert into employee values(5,40,6500.00)
insert into employee values(6,40,14500.00)
insert into employee values(7,40,44500.00)
insert into employee values(8,50,6500.00)
insert into employee values(9,50,7500.00)

數據顯示為

empid       deptid      salary
----------- ----------- ---------------------------------------
1           10          5500.00
2           10          4500.00
3           20          1900.00
4           20          4800.00
5           40          6500.00
6           40          14500.00
7           40          44500.00
8           50          6500.00
9           50          7500.00

需求:根據部門分組,顯示每個部門的工資等級

預期結果:

empid       deptid      salary                                  rank
----------- ----------- --------------------------------------- --------------------
1           10          5500.00                                 1
2           10          4500.00                                 2
4           20          4800.00                                 1
3           20          1900.00                                 2
7           40          44500.00                               1
6           40          14500.00                               2
5           40          6500.00                                 3
9           50          7500.00                                 1
8           50          6500.00                                 2

SQL腳本:

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee


免責聲明!

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



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