sql語句中限制結果集行數
在進行資料檢索的時候有時候需要只檢索結果集中的部分行,比如說「檢索成績排前三
名的學生」、「檢索工資水平排在第3位到第7位的員工資訊」,這種功能被稱為「限制結果集
行數」。在雖然主流的資料庫系統中都提供了限制結果集行數的方法,但是無論是語法還是
使用方式都存在著很大的差異,即使是同乙個資料庫系統的不同版本(比如mssqlserver2000
和mssqlserver2005)也存在著一定的差異。因此本節將按照資料庫系統來講解每種資料庫
系統對限制結果集行數的特性支援。
1,mysql
mysql中提供了limit關鍵字用來限制返回的結果集,limit放在select語句的最後位置,
語法為「limit 首行行號,要返回的結果集的最大數目」。比如下面的sql語句將返回按照工
資降序排列的從第二行開始(行號從0開始)的最多五條記錄:
select * from t_employee order by fsalary desc limit 2,5
2,oracle
oracle中支援視窗函式row_number(),其用法和mssqlserver2005中相同,
row_number()函式可以計算每一行資料在結果集中的行號(從1開始計數),其使用語法
如下:
row_number over(排序規則)
比如我們執
行下面的sql語句:
oracle支援標準的函式row_number(),不過oracle中提供了更方便的特性用來計算行號,select * from
( select row_number() over(order by fsalary desc) row_num,
fnumber,fname,fsalary,fage from t_employee
) a
where a.row_num>=3 and a.row_num<=5
也就在oracle中可以無需自行計算行號,oracle為每個結果集都增加了乙個預設的表示行號
的列,這個列的名稱為rownum。比如我們執行下面的sql語句:
select rownum,fnumber,fname,fsalary,fage from t_employee
使用rownum我們可以很輕鬆的取得結果集中前n條的資料行,比如我們執行下面的sql
語句可以得到按工資從高到底排序的前6名員工的資訊:
看到這裡,您可能認為下面的sql就可以非常容易的實現「按照工資從高到低的順序取select * from t_employee
where rownum<=6
order by fsalary desc
出第三個到第五個員工資訊」的功能了:
執行完畢我們就能在輸出結果中看到下面的執行結果:select rownum,fnumber,fname,fsalary,fage from t_employee
where rownum between 3 and 5
order by fsalary desc
rownum fnumber fname fsalary fage
檢索結果為空!!!這非常出乎我們的意料。讓我們來回顧一下rownum的含義:rownum
為結果集中每一行的行號(從1開始計數)。對於下面的sql:
當進行檢索的時候,對於第一條資料,其rownum為1,因為符合「where rownum<=6」select * from t_employee
where rownum<=6
order by fsalary desc
所以被放到了檢索結果中;當檢索到第二條資料的時候,其rownum為2,因為符合「where
rownum<=6」所以被放到了檢索結果中……依次類推,直到第七行。所以這句sql語句能夠實
現「按照工資從高到低的順序取出第三個到第五個員工資訊」的功能。
而對於這句sql語句:
當進行檢索的時候,對於第一條資料,其rownum為1,因為不符合「where rownumselect rownum,fnumber,fname,fsalary,fage from t_employee
where rownum between 3 and 5
order by fsalary desc
between 3 and 5」,所以沒有被放到了檢索結果中;當檢索到第二條資料的時候,因為第
一條資料沒有放到結果集中,所以第二條資料的rownum仍然為1,而不是我們想像的2,所以因
為不符合「where rownum<=6」,沒有被放到了檢索結果中;當檢索到第三條資料的時候,
因為第一、二條資料沒有放到結果集中,所以第三條資料的rownum仍然為1,而不是我們想像
的3,所以因為不符合「where rownum<=6」,沒有被放到了檢索結果中……依此類推,這樣
所有的資料行都沒有被放到結果集中。
因此如果要使用rownum來實現「按照工資從高到低的順序取出第三個到第五個員工資訊」
的功能,就必須借助於視窗函式row_number()。
3,mssqlserver2000
mssqlserver2000中提供了top關鍵字用來返回結果集中的前n條記錄,其語法為
「select top 限制結果集數目 字段列表 select語句其餘部分」,比如下面的sql語句用來
檢索工資水平排在前五位(按照工資從高到低)的員工資訊:
select top 5 * from t_employee order by fsalary desc
mssqlserver2000沒有直接提供返回提供「檢索從第5行開始的10條資料」、「檢索第五行
至第十二行的資料」等這樣的取區間範圍的功能,不過可以採用其他方法來變通實現,最常
使用的方法就是用子查詢
,比如要實現檢索按照工資從高到低排序檢索從第六名開始一共
三個人的資訊,那麼就可以首先將前五名的主鍵取出來,在檢索的時候檢索排除了這五名員
工的前三個人,sql如下:
select top 3 * from t_employee
where fnumber not in
(select top 5 fnumber from t_employee order by fsalary desc)
order by fsalary desc
SQL查詢之限制結果集行數(分頁)
以前遇到需要查詢前幾行,或者需要分頁查詢時,經常到處找,亂 散 耗費時間,特此做一下彙總。本文只講sql,不設計orm框架。首先,我們用到的資料庫種類很多,每種資料庫提供的語法還是有很大不同的,這裡只列主流的幾種。mysql 提供了limit關鍵字用來限制返回的的結果集,limit放在select語...
結果集ResultSet獲取行數
最近有課,跟著老師寫個小微博,他的介面是這樣的 然後在獲取微博數的時候我跳進了坑!老師用的jdbc,select那塊是list,map然後在獲取以後可以直接通過size 獲取微博數,我用的c3p0返回的resulset結果集,所以悲劇發生了 看下我的code public int getcountw...
sql查詢語句中
sql查詢語句中select t.status,t.rowid from person t where t.status 2,此處查詢的是status不等於2的記錄,並過濾掉status為null的記錄。注意 此處不管status是integer型別還是long型別,都會過濾掉status為null...