萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> sql 取前幾行記錄語句

sql 取前幾行記錄語句

本文章總結了現在常用的幾種數據庫獲取前幾條記錄的sql,包括有db2,oracle,sqlserver和mysql數據庫哦,各位可參考。

SQLITE數據庫:

 代碼如下 復制代碼 select  * from table limit  N


db2數據庫:

 代碼如下 復制代碼

select * from tab fetch first 10 rows only

oracle數據庫:

 代碼如下 復制代碼

select * from tab where rownum <=10

sqlserver數據庫:

 代碼如下 復制代碼

select top 10 * from tab


1)如果表中有主鍵,可以用IN的方式。

 代碼如下 復制代碼

SELECT * FROM tmp_Trans t
WHERE ID IN(
 SELECT TOP 2 ID
 FROM tmp_Trans
 WHERE PO_NO=t.PO_NO
 ORDER BY Trans_Date DESC
)

2)如果沒有主鍵,可以用判斷在本條記錄前有多少條記錄的方式。但使用這種方式時如果遇到Trans_Date相同的情況會不准。如當存在Trans_Date最大的記錄有三條時,這三條記錄都會查出來。

 代碼如下 復制代碼

SELECT *
FROM tmp_Trans t
WHERE (
 SELECT COUNT(*)
 FROM tmp_Trans
 WHERE PO_NO=t.PO_NO AND Trans_Date>T.Trans_Date
)<2

3)使用CROSS APPLY子句。CROSS APPLY是SQL Server 2005後出來的新功能,用於在表連接時傳入參數。

 代碼如下 復制代碼

SELECT DISTINCT b.*
FROM tmp_Trans a
CROSS APPLY
(
 SELECT TOP(2) * FROM tmp_Trans WHERE a.PO_NO=PO_NO ORDER BY Trans_Date DESC
) b

2.使用自動生成的Row Number。在使用 ROW_NUMBER()時可以用PARTITION BY子句來分組。建議使用這種方式。

 代碼如下 復制代碼

select * from (
 select ROW_NUMBER() OVER(PARTITION BY PO_NO ORDER BY Trans_Date DESC) as rowid,*
 from tmp_Trans
) a
where rowid<=2


mysql數據庫:

 代碼如下 復制代碼

select * from tab limit 10

注意:對Oracle的查詢中 如果有如下order by子句,查詢出來的數據可能不是你想要的
Oracle處理流程是:先搜索出rownum<2 的信息,再排序

 代碼如下 復制代碼

select table_name from t_tables where rownum<2 order by table_name desc;

需要寫成如下方式:

 代碼如下 復制代碼

select t2.* from (select * from t_tables t order by table_name desc) t2 where rownum<2

copyright © 萬盛學電腦網 all rights reserved