SQL查詢之限制結果集行數(分頁)

2021-06-28 04:21:07 字數 3522 閱讀 7258

以前遇到需要查詢前幾行,或者需要分頁查詢時,經常到處找,亂、散、耗費時間,特此做一下彙總。

本文只講sql,不設計orm框架。

首先,我們用到的資料庫種類很多,每種資料庫提供的語法還是有很大不同的,這裡只列主流的幾種。

mysql:

提供了limit關鍵字用來限制返回的的結果集,limit放在select語句的最後位置,limit有2個引數,第乙個是返回行數的起始位置,第二個是返回的最大行數。例如:

select * from t_user order by id limit  2,5

上述查詢語句的結果集:查詢排名第3~7的年齡最小的使用者。   如果需要查詢前n行,只需改變limit引數,例如: 前三行,即 limit 0 , 3

mssqlserver2000:

提供了 top 關鍵字用來返回結果集中的前n條。見例子:

select top 5 * from t_user order by age

上述查詢語句的結果集:查詢排名前5的年齡最小的使用者。 

由於 sqlserver2000 未提供 「檢索從m行到n行的資料」 這樣的取區間範圍的功能,故可用子查詢

select top 5 * from t_user where id not in ( select top 10 id from t_user order by age ) order by age

上述查詢語句的結果集:查詢排名前11~15的年齡最小的使用者。 

mssqlserver2005:

sqlserver2005 相容 幾乎所有的 sqlserver2000的語法,所以可以是繼續用 top 來限制結果集行數。另外,sqlserver2005提供了新特性就是視窗函式row_number(),可以計算每一行資料在結果集中的行號(從1開始計數),語法: row_number()  over(排序規則)  示例:

select row_number()  over(order by age),* from t_user

上述查詢語句的結果集:查詢按年齡公升序排列的使用者,並且第一列是每行的序號(1,2,3,···)。

如果我們需要查詢: 查詢排名前11~15的年齡最小的使用者。 則需要用子查詢來實現,例:

select * from ( select row_number() over( order by age ) as rownum, *  from t_user ) as a where a.rownum>=11 and a.rownum<=15

oracle:

a)、支援視窗函式row_number(),其用法和mssqlserver2005中相同,例如:查詢排名前11~15的年齡最小的使用者

select * from ( select row_number() over( order by age )   row_num, *  from t_user )   a where a.row_num>=11  and  a.row_num<=15    

這個地方需要注意:1、定義別名時,不能使用as。2、rownum 是oracle的關鍵字,不能做為別名,因此用 row_num代替。

b)、關鍵字:rownum。oracle中無需自行計算行號,它會為每個結果集都增加乙個預設的表示行號的列,這個列的名稱就是rownum。

例如:查詢排名前5的年齡最小的使用者

select * from t_user  where  rownum <=5 order by age

注意:關鍵字rownum只有結果集中有資料時,rownum才有意義。 如果在條件中存在 rownum between m and n ,m>1.則查詢為空。

db2:

a)、支援視窗函式row_number(),其用法和mssqlserver2005以及oracle中相同。例如:查詢排名前11~15的年齡最小的使用者

select * from ( select row_number() over( order by age )   row_num, *  from t_user )   a where a.row_num>=11  and  a.row_num<=15   

b)、關鍵字fetch,用來提取結果集的前n行。語法:fetch first m  rows only  其中 m 為條數。例如:

select * from t_user order by age fetch 6 rows only

上述查詢語句的結果集:查詢排名前6的年齡最小的使用者。 需要注意:fetch子句要放在order by語句的後面。

db2沒有直接提供返回 「檢索從第m行到第n行資料」 這樣的取區間範圍的功能,故可以採用其他方法來實現,常用的方法就是子查詢。例:

select  * from t_user where id not in ( select  id from t_user order by age fetch first 10 rows only ) order by age fetch first 5 rows only

上述查詢語句的結果集:查詢排名前11~15的年齡最小的使用者。

除了以上講述的情況,還有兩種方法  「檢索從第m行到第n行資料」。差集 sql minus或sql except,例如:

select * from t_user where 條件1

minus

select * from t_user where 條件2

或者select * from t_user where 條件1

except

select * from t_user where 條件2

上述查詢語句的結果集: 根據條件1查出的結果集 減去 根據條件2查出的結果集。注意:minus和except並不是每個資料庫都支援,請測試後使用。

以orcale中使用minus舉例:查詢排名前11~15的年齡最小的使用者

select * from t_user  where  rownum <=15 order by age

minus

select * from t_user  where  rownum <=10 order by age

以上,就是我總結的關於 檢索取區間資料的所有方法,希望對大家有點幫助。

sql語句中限制結果集行數

sql語句中限制結果集行數 在進行資料檢索的時候有時候需要只檢索結果集中的部分行,比如說 檢索成績排前三 名的學生 檢索工資水平排在第3位到第7位的員工資訊 這種功能被稱為 限制結果集 行數 在雖然主流的資料庫系統中都提供了限制結果集行數的方法,但是無論是語法還是 使用方式都存在著很大的差異,即使是...

04 查詢集 限制查詢 和 分頁查詢

1 查詢結果集 查詢集,也稱查詢結果集 queryset,表示從資料庫中獲取的物件集合。當呼叫如下過濾器方法時,django會返回查詢集 而不是簡單的列表 all 返回所有資料。filter 返回滿足條件的資料。exclude 返回滿足條件之外的資料。order by 對結果進行排序。判斷某乙個查詢...

sql查詢結果集匯出Excel

t sql exec master.xp cmdshell bcp 庫名.dbo.表名out c temp.xls c q s servername u sa p 引數 s 是sql伺服器名 u是使用者 p是密碼 說明 還可以匯出文字檔案等多種格式 declare str varchar 600 s...