資料庫查詢返回特定結果即分頁查詢

2021-12-30 11:23:09 字數 3435 閱讀 5013

資料庫查詢返回特定結果即分頁查詢

1 幾種不同資料庫的不同的分頁寫法:

a mysql 1

a) 查詢前n條記錄

2select * from table_name limit 0,n

3b) 查詢第n條到第m條

4select * from table_name limit n,m

b oracle  1

a)查詢前n條記錄

2select * from table_name where rownum

3b)查詢第m條到第n條記錄:

4select * from (select a.*,a.rownum rn from table_name where rownumm

c sqlserver

1a)查詢前n條記錄:

2select top n * from table_name;

3b)查詢第n條到第m條記錄:

4select top n * from (select top m * from table_name order by column_name) a order by column_name desc

2 oracle rownum的用法

對於rownum來說它是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個偽欄位可以用於限制查詢返回的總行數,而且rownum不能以任何表的名稱作為字首。

(1) rownum 對於等於某值的查詢條件

如果希望找到學生表中第一條學生的資訊,可以使用rownum=1作為條件。但是想找到學生表中第二條學生的資訊,使用rownum=2結果查不到資料。因為rownum都是從1開始,但是1以上的自然數在rownum做等於判斷是時認為都是false條件,所以無法查到rownum = n(n>1的自然數)。

sql> select rownum,id,name from student where rownum=1;(可以用在限制返回記錄條數的地方,保證不出錯,如:隱式游標)

(2)rownum對於大於某值的查詢條件

如果想找到從第二行記錄以後的記錄,當使用rownum>2是查不出記錄的,原因是由於rownum是乙個總是從1開始的偽列,oracle 認為rownum> n(n>1的自然數)這種條件依舊不成立,所以查不到記錄。

那如何才能找到第二行以後的記錄呀。可以使用以下的子查詢方法來解決。注意子查詢中的rownum必須要有別名,否則還是不會查出記錄來,這是因為rownum不是某個表的列,如果不起別名的話,無法知道rownum是子查詢的列還是主查詢的列。

sql>select * from(select rownum no ,id,name from student) where no>2;

(3)rownum對於小於某值的查詢條件

如果想找到第三條記錄以前的記錄,當使用rownum<3是能得到兩條記錄的。顯然rownum對於rownum1的自然數)的條件認為是成立的,所以可以找到記錄。

sql> select rownum,id,name from student where rownum <3;

綜上幾種情況,可能有時候需要查詢rownum在某區間的資料,那怎麼辦呀從上可以看出rownum對小於某值的查詢條件是人為true的,rownum對於大於某值的查詢條件直接認為是false的,但是可以間接的讓它轉為認為是true的。那就必須使用子查詢。例如要查詢rownum在第二行到第三行之間的資料,包括第二行和第三行資料,那麼我們只能寫以下語句,先讓它返回小於等於三的記錄行,然後在主查詢中判斷新的rownum的別名列大於等於二的記錄行。但是這樣的操作會在大資料集中影響速度。

sql> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;

(4)rownum和排序

oracle中的rownum的是在取資料的時候產生的序號,所以想對指定排序的資料去指定的rowmun行資料就必須注意了。

sql> select rownum ,id,name from student order by name;

可以看出,rownum並不是按照name列來生成的序號。系統是按照記錄插入時的順序給記錄排的號,rowid也是順序分配的。為了解決這個問題,必須使用子查詢

sql> select rownum ,id,name from (select * from student order by name);

3 mysql中的limit用法

具體的語法為:  

1select * from table  limit [offset,] rows | rows offset offset

limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 postgresql 相容,mysql 也支援句法: limit # offset #。  1

mysql> select * from table limit 5,10;  // 檢索記錄行 6-152 

3//為了檢索從某乙個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:

4mysql> select * from table limit 95,-1; // 檢索記錄行 96-last.5 

6//如果只給定乙個引數,它表示返回最大的記錄行數目:

7mysql> select * from table limit 5;     //檢索前 5 個記錄行8 

9//換句話說,limit n 等價於 limit 0,n。

4 mysql的高效分頁寫法

1select a.* from (

2  select id from table b force index(ind_group_type_time)

3  where b.id=1111 order by b.update_time desc limit  xx, xx

4) b, table a where a.id=b.id;

mysql的limit工作原理就是先讀取n條記錄,然後拋棄前n條,讀m條想要的,所以n越大,效能會越差。 

優化前sql: select * from member order by last_active limit 50,5 

優化後sql: select * from member inner join (select member_id from member order by last_active limit 50, 5) using (member_id) 

分別在於,優化前的sql需要更多i/o浪費,因為先讀索引,再讀資料,然後拋棄無需的行。而優化後的sql(子查詢那條)唯讀索引(cover index)就可以了,然後通過member_id讀取需要的列。

5 分頁寫法的頁數計算

總頁數=(總記錄數-1)/每頁顯示的記錄數 +1

資料庫查詢結果分頁顯示思路

資料庫查詢結果分頁顯示思路,通過計算result set指標位置實現分頁顯示 設定頁面顯示數量 int pagesize 獲取要顯示頁面 int currentpage 需要定義的引數 connection con statement sta resultset rs statement 或者 pr...

資料庫查詢分頁。

csdn上推薦的,轉過來的。呵呵!表中主鍵必須為標識列,id int identity 1,1 1.分頁方案一 利用not in和select top分頁 語句形式 select top 頁記錄數量 from 表名 where id not in select top 每頁行數 頁數 1 id fr...

資料庫分頁查詢

資料庫分頁查詢 在這裡主要講解一下mysql sqlserver2000 及sqlserver2005 和orcale三種資料庫實現分頁查詢的方法。可能會有人說這些網上都有,但我的主要目的是把這些知識通過我實際的應用總結歸納一下,以方便大家查詢使用。下面就分別給大家介紹 講解一下三種資料庫實現分頁查...