“取出資料表中第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的細節,還是沒有搞明白呢,往後再多看看-多實踐再總結咯