萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 各種數據庫分頁查詢sql語句大全

各種數據庫分頁查詢sql語句大全

在顯示記錄條目時往往要用到分頁,一種常用的辦法是利用各種數據庫自帶的定位接口對原始查詢語句進行改寫,從而只取出特定范圍的某些記錄。不同的數據庫,查詢定位接口是不一樣的,下面做一匯總:

 數據庫

 分頁查詢語句

 說明

 MySQL

   "QUERY_SQL limit ?,?"            使用limit關鍵字,第一個"?"是起始行號,
  第二個"?"是返回條目數

 Oracle

 SELECT * FROM 
 ( SELECT A.*, ROWNUM RN  FROM 
 (QUERY_SQL ) A  WHERE ROWNUM 
 <= ?) WHERE RN >= ?

 結合rownum關鍵字,利用嵌套三層select 
 語句實現。第一個"?"表示終止行號,
  第二個"?"表示其實行號

 sql server

 尚無通用語句  可使用top n來返回前n條記錄或使用存儲過程

 DB2

 假設查詢語句:select t1.* from t1 order
 by t1.id; 分頁語句可為:
 "select * from ( select rownumber() over 
  (order by t1.id) as row_, t1.* from t1 
  order by t1.id) as temp_ where row_ 
  between ?+1 and ?"   返回兩個"?"之間的記錄

 InterBase

 “QUERY_SQL row ? to ?”   返回兩個"?"之間的記錄  PostgreSQL  “QUERY_SQL limit ? offset ?”   第一個"?"為起始行號,第二個"?"代表
  返回記錄數

SQL Server 
關於分頁 SQL 的資料許多,有的使用存儲過程,有的使用游標。本人不喜歡使用游標,我覺得它耗資、效率低;使用存儲過程是個不錯的選擇,因為存儲過程是顛末預編譯的,執行效率高,也更靈活。先看看單條 SQL 語句的分頁 SQL 吧。 
方法1: 
適用於 SQL Server 2000/2005 
SELECT TOP 頁大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id ) ORDER BY id 
方法2: 
適用於 SQL Server 2000/2005 
SELECT TOP 頁大小 * FROM table1 WHERE id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id ) A ) ORDER BY id 
方法3: 
適用於 SQL Server 2005 
SELECT TOP 頁大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) A WHERE RowNumber > 頁大小*(頁數-1) 
說明,頁大小:每頁的行數;頁數:第幾頁。使用時,請把“頁大小”以及“頁大小*(頁數-1)”替換成數碼。 

MYSQL 
SELECT * FROM TT LIMIT 1,20 
SELECT * FROM TT LIMIT 21,30 
/*
如果你是幾千上萬數據,就直接使用mysql自帶的函數 limit的普通用法就ok了,如果是100萬以上的數據,可能就要講方法了,下面我們來做個百萬級數據的分頁查詢語句.

mysql> select * from news where id>=(select id from news limit 490000,1) limit 10;    //0.18 sec  //很 明顯,這 種方式勝出 .
mysql> select * from news limit 490000,10  //0.22 sec;

*/

以下的文章主要介紹的是MySQL分頁的實際操作方案,其實關於實現MySQL分頁的最簡單的方法就是利用利用mysql數據庫的LIMIT函數,LIMIT [offset,] rows可以從MySQL數據庫表中第M條記錄開始檢索N條記錄的語句為:

  1. SELECT * FROM 表名稱 LIMIT M,N 

例如從表Sys_option(主鍵為sys_id)中從第10條記錄開始檢索20條記錄,語句如下:

  1. select * from sys_option limit 10,20   
  2. select * from table [查詢條件] order by id limit ?,?   

Oracle 
Oracle的分頁查詢語句基本上可以按照這篇了,下一篇文章會通過例子來申述。下面簡單討論一下多表聯合的情況。對最多見的等值表連接查詢,CBO 一般可能會采用兩種連接方式NESTED LOOP以及HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不會考慮)。在這裡,由於使用了分頁,因此指定了一個歸回的最大記載數,NESTED LOOP在歸回記載數跨越最大值時可以頓時遏制並將結果歸回給中心層,而HASH JOIN必需處理完所有成集(MERGE JOIN也是)。那麼在大部分的情況下,對分頁查詢選擇NESTED LOOP作為查詢的連接方法具有較高的效率(分頁查詢的時候絕大部分的情況是查詢前幾頁的數據,越靠後面的頁數訪問概率越小)。 
因此,如果不介意在體系中使用HINT的話,可以將分頁的查詢語句改寫為: 
SELECT /*+ FIRST_ROWS */ * FROM 

SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
WHERE ROWNUM <= 40 

WHERE RN >= 21

關鍵詞:SQL  分頁  查詢 

copyright © 萬盛學電腦網 all rights reserved