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...
String sql="select top n-m+1 * from test where (id not in(select top m-1 id from test))"; //能夠是正常順序的第m條到第n條記錄寫法。非常推薦哦~
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 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的細節,還是沒有搞明確呢,往后再多看看-多實踐再總結咯