sql語句中限制結果集行數

2021-09-01 10:01:24 字數 3342 閱讀 9763

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語句: 

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支援標準的函式row_number(),不過oracle中提供了更方便的特性用來計算行號,

也就在oracle中可以無需自行計算行號,oracle為每個結果集都增加了乙個預設的表示行號

的列,這個列的名稱為rownum。比如我們執行下面的sql語句: 

select rownum,fnumber,fname,fsalary,fage from t_employee
使用rownum我們可以很輕鬆的取得結果集中前n條的資料行,比如我們執行下面的sql

語句可以得到按工資從高到底排序的前6名員工的資訊: 

select * from t_employee 

where rownum<=6

order by fsalary desc

看到這裡,您可能認為下面的sql就可以非常容易的實現「按照工資從高到低的順序取

出第三個到第五個員工資訊」的功能了: 

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: 

select * from t_employee 

where rownum<=6

order by fsalary desc

當進行檢索的時候,對於第一條資料,其rownum為1,因為符合「where rownum<=6」

所以被放到了檢索結果中;當檢索到第二條資料的時候,其rownum為2,因為符合「where

rownum<=6」所以被放到了檢索結果中……依次類推,直到第七行。所以這句sql語句能夠實

現「按照工資從高到低的順序取出第三個到第五個員工資訊」的功能。

而對於這句sql語句: 

select rownum,fnumber,fname,fsalary,fage from t_employee 

where rownum between 3 and 5

order by fsalary desc

當進行檢索的時候,對於第一條資料,其rownum為1,因為不符合「where rownum

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...