程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 數據庫查詢返回特定結果即分頁查詢

數據庫查詢返回特定結果即分頁查詢

編輯:MySQL綜合教程

數據庫查詢返回特定結果即分頁查詢   1 幾種不同數據庫的不同的分頁寫法: a mysql   1 a) 查詢前n條記錄 2 select * from table_name limit 0,n 3 b) 查詢第n條到第m條 4 select * from table_name limit n,m b oracle    1 a)查詢前n條記錄 2 select * from table_name where rownum 3 b)查詢第m條到第n條記錄: 4 select * from (select a.*,a.rownum rn from table_name where rownum<n) where rn>m c sqlserver 1 a)查詢前n條記錄: 2 select top n * from table_name; 3 b)查詢第n條到第m條記錄: 4 select 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對於rownum<n((n>1的自然數)的條件認為是成立的,所以可以找到記錄。 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用法 具體的語法為:     1 SELECT * 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-15 2   3 //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1: 4 mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last. 5   6 //如果只給定一個參數,它表示返回最大的記錄行數目: 7 mysql> SELECT * FROM table LIMIT 5;     //檢索前 5 個記錄行 8   9 //換句話說,LIMIT n 等價於 LIMIT 0,n。   4 mysql的高效分頁寫法 1 Select 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   總結一下:數據庫中mysql和oracle的分頁寫法都不一致,各個數據庫有各自的特點。另外要注意下相關sql的性能優化,特別是針對大數據的翻頁查詢。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved