“取出資料表中第10條到第20條記錄”的sql語句+select top 用法,第10條sql

來源:互聯網
上載者:User

“取出資料表中第10條到第20條記錄”的sql語句+select top 用法,第10條sql

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的細節,還是沒有搞明白呢,往後再多看看-多實踐再總結咯



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.