以前遇到需要查詢前幾行,或者需要分頁查詢時,經常到處找,亂、散、耗費時間,特此做一下彙總。
本文只講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(排序規則) 示例:如果我們需要查詢: 查詢排名前11~15的年齡最小的使用者。 則需要用子查詢來實現,例:select row_number() over(order by age),* from t_user
上述查詢語句的結果集:查詢按年齡公升序排列的使用者,並且第一列是每行的序號(1,2,3,···)。
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的年齡最小的使用者b)、關鍵字fetch,用來提取結果集的前n行。語法:fetch first m rows only 其中 m 為條數。例如: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
select * from t_user order by age fetch 6 rows onlydb2沒有直接提供返回 「檢索從第m行到第n行資料」 這樣的取區間範圍的功能,故可以採用其他方法來實現,常用的方法就是子查詢。例:上述查詢語句的結果集:查詢排名前6的年齡最小的使用者。 需要注意:fetch子句要放在order by語句的後面。
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以orcale中使用minus舉例:查詢排名前11~15的年齡最小的使用者minus
select * from t_user where 條件2
或者select * from t_user where 條件1
except
select * from t_user where 條件2
上述查詢語句的結果集: 根據條件1查出的結果集 減去 根據條件2查出的結果集。注意:minus和except並不是每個資料庫都支援,請測試後使用。
select * from t_user where rownum <=15 order by ageminus
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...