只適用於MySQL. 請參考下面資料。
限制結果集行數
在進行資料檢索的時候有時候需要只檢索結果集中的部分行,比如說“檢索成績排前三名的學生”、“檢索工資水平排在第3位到第7位的員工資訊”,這種功能被稱為“限制結果集行數”。在雖然主流的資料庫系統中都提供了限制結果集行數的方法,但是無論是語法還是使用方式都存在著很大的差異,即使是同一個資料庫系統的不同版本(比如MSSQLServer2000和MSSQLServer2005)也存在著一定的差異。因此本節將按照資料庫系統來講解每種資料庫系統對限制結果集行數的特性支援。
MYSQL
MYSQL中提供了LIMIT關鍵字用來限制返回的結果集,LIMIT放在SELECT語句的最後位置,語法為“LIMIT 首行行號,要返回的結果集的最大數目”。比如下面的SQL語句將返回按照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄:
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5
返回按照工資降序排列的前五條記錄
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 0,5
MS SQLServer2000
MSSQLServer2000中提供了TOP關鍵字用來返回結果集中的前N條記錄,其語法為“SELECT TOP 限制結果集數目 欄位列表 SELECT語句其餘部分”,比如下面的SQL語句用來檢索工資水平排在前五位(按照工資從高到低)的員工資訊:
select top 5 * from T_Employee order by FSalary Desc
實現檢索按照工資從高到低排序檢索從第六名開始一共三個人的資訊,那麼就可以首先將前五名的主鍵取出來,在檢索的時候檢索排除了這五名員工的前三個人,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
MS SQLServer2005
MSSQLServer2005相容幾乎所有的MSSQLServer2000的語法,所以可以使用上個小節提到的方式來在MSSQLServer2005中實現限制結果集行數,不過MSSQLServer2005提供了新的特性來幫助更好的限制結果集行數的功能,這個新特性就是視窗函式ROW_NUMBER()。ROW_NUMBER()不能用在WHERE語句中。
ROW_NUMBER()函式可以計算每一行資料在結果集中的行號(從1開始計數),其使用語法如下:
ROW_NUMBER OVER(排序規則)
比如我們執行下面的SQL語句:
SELECT ROW_NUMBER() OVER(ORDER BY FSalary),FNumber,FName,FSalary,FAge
FROM T_Employee
返回第3行到第5行的資料
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) AS rownum,
FNumber,FName,FSalary,FAge FROM T_Employee
) AS a
WHERE a.rownum>=3 AND a.rownum
Oracle
Oracle中支援視窗函式ROW_NUMBER(),其用法和MSSQLServer2005中相同.
注意:rownum在Oracle中為保留字,所以這裡將MSSQLServer2005中用到的rownum替換為row_num;Oracle中定義表別名的時候不能使用AS關鍵字,所以這裡也去掉了AS。
在Oracle中可以無需自行計算行號,Oracle為每個結果集都增加了一個預設的表示行號的列,這個列的名稱為rownum
SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee
得到按工資從高到底排序的前6名員工的資訊
SELECT * FROM T_Employee
WHERE rownum
ORDER BY FSalary Desc
DB2
DB2中支援視窗函式ROW_NUMBER(),其用法和MSSQLServer2005以及Oracle中相同.
,DB2還提供了FETCH關鍵字用來提取結果集的前N行,其語法為“FETCH FIRST 條數 ROWS ONLY”,比如我們執行下面的SQL語句可以得到按工資從高到底排序的前6名員工的資訊:需要注意的是FETCH子句要放到ORDER BY語句的後面
FETCH FIRST 6 ROWS ONLY
檢索按照工資從高到低排序檢索從第六名開始一共三個人的資訊,那麼就可以首先將前五名的主鍵取出來,在檢索的時候檢索排除了這五名員工的前三個人,SQL如下:
SELECT FNumber FROM T_Employee
FETCH FIRST 5 ROWS ONLY
)
FETCH FIRST 3 ROWS ONLY
抑制資料重複 DISTINCT
DISTINCT關鍵字是用來進行重複資料抑制的最簡單的功能,而且所有的資料庫系統都支援DISTINCT,DISTINCT的使用也非常簡單,只要在SELECT之後增加DISTINCT即可. DISTINCT是對整個結果集進行資料重複抑制的.
SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee
只適用於MySQL. 請參考下面資料。
限制結果集行數
在進行資料檢索的時候有時候需要只檢索結果集中的部分行,比如說“檢索成績排前三名的學生”、“檢索工資水平排在第3位到第7位的員工資訊”,這種功能被稱為“限制結果集行數”。在雖然主流的資料庫系統中都提供了限制結果集行數的方法,但是無論是語法還是使用方式都存在著很大的差異,即使是同一個資料庫系統的不同版本(比如MSSQLServer2000和MSSQLServer2005)也存在著一定的差異。因此本節將按照資料庫系統來講解每種資料庫系統對限制結果集行數的特性支援。
MYSQL
MYSQL中提供了LIMIT關鍵字用來限制返回的結果集,LIMIT放在SELECT語句的最後位置,語法為“LIMIT 首行行號,要返回的結果集的最大數目”。比如下面的SQL語句將返回按照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄:
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5
返回按照工資降序排列的前五條記錄
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 0,5
MS SQLServer2000
MSSQLServer2000中提供了TOP關鍵字用來返回結果集中的前N條記錄,其語法為“SELECT TOP 限制結果集數目 欄位列表 SELECT語句其餘部分”,比如下面的SQL語句用來檢索工資水平排在前五位(按照工資從高到低)的員工資訊:
select top 5 * from T_Employee order by FSalary Desc
實現檢索按照工資從高到低排序檢索從第六名開始一共三個人的資訊,那麼就可以首先將前五名的主鍵取出來,在檢索的時候檢索排除了這五名員工的前三個人,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
MS SQLServer2005
MSSQLServer2005相容幾乎所有的MSSQLServer2000的語法,所以可以使用上個小節提到的方式來在MSSQLServer2005中實現限制結果集行數,不過MSSQLServer2005提供了新的特性來幫助更好的限制結果集行數的功能,這個新特性就是視窗函式ROW_NUMBER()。ROW_NUMBER()不能用在WHERE語句中。
ROW_NUMBER()函式可以計算每一行資料在結果集中的行號(從1開始計數),其使用語法如下:
ROW_NUMBER OVER(排序規則)
比如我們執行下面的SQL語句:
SELECT ROW_NUMBER() OVER(ORDER BY FSalary),FNumber,FName,FSalary,FAge
FROM T_Employee
返回第3行到第5行的資料
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) AS rownum,
FNumber,FName,FSalary,FAge FROM T_Employee
) AS a
WHERE a.rownum>=3 AND a.rownum
Oracle
Oracle中支援視窗函式ROW_NUMBER(),其用法和MSSQLServer2005中相同.
注意:rownum在Oracle中為保留字,所以這裡將MSSQLServer2005中用到的rownum替換為row_num;Oracle中定義表別名的時候不能使用AS關鍵字,所以這裡也去掉了AS。
在Oracle中可以無需自行計算行號,Oracle為每個結果集都增加了一個預設的表示行號的列,這個列的名稱為rownum
SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee
得到按工資從高到底排序的前6名員工的資訊
SELECT * FROM T_Employee
WHERE rownum
ORDER BY FSalary Desc
DB2
DB2中支援視窗函式ROW_NUMBER(),其用法和MSSQLServer2005以及Oracle中相同.
,DB2還提供了FETCH關鍵字用來提取結果集的前N行,其語法為“FETCH FIRST 條數 ROWS ONLY”,比如我們執行下面的SQL語句可以得到按工資從高到底排序的前6名員工的資訊:需要注意的是FETCH子句要放到ORDER BY語句的後面
SELECT * FROM T_Employee
ORDER BY FSalary Desc
FETCH FIRST 6 ROWS ONLY
檢索按照工資從高到低排序檢索從第六名開始一共三個人的資訊,那麼就可以首先將前五名的主鍵取出來,在檢索的時候檢索排除了這五名員工的前三個人,SQL如下:
SELECT * FROM T_Employee
WHERE FNumber NOT IN
(
SELECT FNumber FROM T_Employee
ORDER BY FSalary DESC
FETCH FIRST 5 ROWS ONLY
)
ORDER BY FSalary DESC
FETCH FIRST 3 ROWS ONLY
抑制資料重複 DISTINCT
DISTINCT關鍵字是用來進行重複資料抑制的最簡單的功能,而且所有的資料庫系統都支援DISTINCT,DISTINCT的使用也非常簡單,只要在SELECT之後增加DISTINCT即可. DISTINCT是對整個結果集進行資料重複抑制的.
SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee