“取出數據表中第10條到第20條記錄”的sql語句+select top 使用方法


1.首先。select top使用方法:

參考問題  select top n * from和select * from的差別

select from table --  取全部數據。返回無序集合

select top n * from table  -- 依據表內數據存儲順序取前n條,返回無序集合

select from table order by id desc -- 取全部數據。按id逆序返回有序列表

select top n * from table order by id desc-- 先按id逆序。再取前n條,返回按id排序的有序集合【注意,按某個屬性排序。該排序屬性的數據列值最好是不反復的。假設有反復的。那排序屬性值相等的這些行在結果集中的順序事先是不能確定的】

  栗子例如以下~

 

我們以pid作為排序屬性值,第16行,第19行和第20行的pid值相等。

如今取以pid排序的倒數5條記錄:

Connection con=new SQLConnection().getConnection();
String sql="select top 5 * from test order by pid desc";

System.out.println("select begins...");

Statement statement=con.createStatement();  
ResultSet result =  statement.executeQuery(sql);  
while (result.next()) {  
        System.out.println(result.getInt(1)+","+result.getString(2)+","+result.getString(3));  
 }
 System.out.println("select ends...");
 con.close();
 statement.close();
 result.close();
 con=null;
 statement=null;
 result=null;

結果:

select begins...
3,as,9
16,tt,8  【三者順序事先不能確定】
19,gh,8
20,jk,8

6,bb,7
select ends...


2. 類似於“查詢第10條到第20條記錄”的sql語句寫法 ===  常應用於分頁顯示上

1) String sql="select  top 10 * from (select * from test where id<21) m order by m.id desc"; //注意id為主鍵。子查詢取出前20條記錄,主查詢先降序再取前10條。但結果是降序的。所以興許處理時要注意

2)查詢第m條到第n條記錄:
String sql="select top n-m+1 * from test where (id not in(select top m-1 id from test))"; //能夠是正常順序的第m條到第n條記錄寫法。非常推薦哦~

3)【有些小毛病。我自己也不知道錯在哪了,寫出來。若有某位看客知道煩請留言一下哦~】
  String sql = "select top 10 * from  (select top 20 * from test) a order by a.id desc";
以上述表中數據試了一下,結果是:【為什么是從第12條到第21條嘞?想不明確】
21,kl,100
20,jk,8
19,gh,8
18,aas,18
17,qw,19
16,tt,8
15,ww,15
14,hh,13
13,gg,16
12,ui,11

   

關於3)的疑惑。在博客園找到這樣一處文章《來談談SQL數據庫中"簡單的"SELECT TOP—可能有你從未注意到的細節

-------------------------------引用開始-----------------------------------

數據表例如以下:

ID  EMPNO  NAME  AGE  

1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30
5   23167   Arishy   30
6   26371   Yager   29

我寫了SQL語句想取得第3、4筆數據,測試分頁玩的。

select  top 2 * from (select top 4 * from Member ) m  order by m.RowID desc

我運行中間那一段子查詢:select top 4 * from Member

取得的是:

1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30

可是整個SQL語句的結果卻是:【確實遇到過這種問題。可是不知道原因....】

5   23167   Arishy   30
6   26371   Yager    29


  select top 2 * from (select top 4 * from table) m order by m.id desc ----- 掃描完table后先降序然后再在4行中取2行   【有點疑問,不是掃描完table--取4行--降序--取2行么??】

  select top 2 * from (select top 4 * from table order by id asc) m order by m.id desc ----- 掃描完table后先升序取4行然后再把這4行降序取2行


問題涉及到SQL中的子查詢:

出如今from子句中的表我們稱為派生表。派生表是虛擬的,未被物理詳細化。也就是說當編譯

的時候。如(select top 2 * from (select top 4 * from table) m order by m.id 

desc ),外部查詢和內部查詢會被合並,並生成一個計划。

(注意事項:在派生表里面一般不同意使用order by除非指定了top。也就是說select top

 2 * from (select * from zhuisuo order by id asc) m order by m.id desc這句語句是不

能運行的)。

派生表是個虛擬表要被外部引用。而order by返回的不是表而是游標.所以僅僅用order by的話是被限制的。然而為什么使用top加order by又能夠了?是由於top能夠從order by返回的游標里選擇指定數量生成一個表並返回。


再舉例關於top須要注意的細節

1、使用top返回隨機行,非常多人會想到用RAND函數從而得到這樣一個語句

select top 4 id,name from table order by rand();

經過多次查詢后,你會失望的發現它沒有返回隨機行。這是由於每一個查詢僅僅調用它一次而不是每

行調用它一次。

2、注意insert中使用top,正確的倒敘插入top方法應該是:

insert into table

select  top (4) * from table order by id desc

------------------------------引用結束----------------------------

具體見原博客,關於top的細節,還是沒有搞明確呢,往后再多看看-多實踐再總結咯




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM