如何用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)
sql分頁查詢語句 首頁,上一頁怎么實現
--假如每頁顯示條數據10條
--哪么第一頁1~10 第二頁11~20 即起始行數=10*(頁數-1)+1,結束行=頁數*10
declare @start int
declare @end int
set @start=8
set @end=18
select * from(
select P_ID,P_ClassName, ROW_NUMBER() OVER(order by P_ID) as row from
*_Position)as a
where row between @start and @end--太酷了,這樣一個分頁就搞定了。還可以這樣變化,可選參數只是[頁的大小]
declare @pagesize int
declare @start int
declare @end int
declare @pagecount int
set @pagecount=2
set @pagesize=10
set @start=(@pagesize*(@pagecount-1)+1)
set @end=@pagecount*@pagesize
select * from(
select P_ID,P_ClassName, ROW_NUMBER() OVER(order by P_ID) as row from
*_Position)as a
where row between @start and @end這是前幾年的一個博文摘錄,希望對你用!
用SQL寫出分頁查詢
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A --不排序 WHERE ROWNUM <= 40 ) WHERE RN >= 21; SELECT * FROM (SELECT a.*, row_number() over(ORDER BY 1) rn--假排序,速度同上 FROM t1 a) WHERE rn BETWEEN 21 AND 40; SELECT * FROM (SELECT a.*, row_number() over(ORDER BY c1) rn --真實排序,無法比較速度 FROM t1 a) WHERE rn BETWEEN 21 AND 40; Oracle的分頁查詢語句基本上可以按照本文給出的格式來進行套用。
分頁查詢格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最內層的查詢SELECT * FROM TABLE_NAME表示不進行翻頁的原始查詢語句。ROWNUM <= 40和RN >= 21控制分頁查詢的每頁的范圍。
上面給出的這個分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果盡快的返回。
在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM <= 40這句上。 選擇第21 到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過ROWNUM <= 40來控制最大值,在查詢的最外層控制最小值。
而另一種方式是去掉查詢第二層的WHERE ROWNUM <= 40語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40 對比這兩種寫法,絕大多數的情況下,第一個查詢的效率比第二個高得多。
這是由于CBO 優化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對于第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。
而第二個查詢語句,由于查詢條件BETWEEN 21 AND 40是存在于查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道RN代表什么)。因此,對于第二個查詢語句,Oracle最內層返回給中間層的是所有滿足條件的數據,而中間層返回給最外層的也是所有數據。
數據的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。 上面分析的查詢不僅僅是針對單表的簡單查詢,對于最內層查詢是復雜的多表聯合查詢或最內層查詢包含排序的情況一樣有效。
這里就不對包含排序的查詢進行說明了,下一篇文章會通過例子來詳細說明。下面簡單討論一下多表聯合的情況。
對于最常見的等值表連接查詢,CBO 一般可能會采用兩種連接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不會考慮)。在這里,由于使用了分頁,因此指定了一個返回的最大記錄數,NESTED LOOP在返回記錄數超過最大值時可以馬上停止并將結果返回給中間層,而HASH JOIN必須處理完所有結果集(MERGE JOIN也是)。
那么在大部分的情況下,對于分頁查詢選擇NESTED LOOP作為查詢的連接方法具有較高的效率(分頁查詢的時候絕大部分的情況是查詢前幾頁的數據,越靠后面的頁數訪問幾率越小)。 因此,如果不介意在系統中使用HINT的話,可以將分頁的查詢語句改寫為: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21。
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)
這樣可以么?
Oracle, SQL Server, My SQL如何實現數據分頁查詢語句
Oracle, SQL Server 和MySQL的分頁SQL語句如下:Oracle:方法一:SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WHERE RN = 21;方法二:SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A)WHERE RN between 21 and 40 公認第二種方法效率沒有第一種高。
原因是第二種要把子查詢執行完,而第一種方法子查詢執行到Rownum=40后就結束了。MySQL: SELECT * FROM TABLE_NAME LIMIT 10, 20 表示從第11條數據開始取20條數據返回,limit后的2個參數含義為:起點和步長,即從那條數據開始,取多少條數據,再如取前20條數據:SELECT * FROM TABLE_NAME LIMIT 0, 20 SQL Server2000: SELECT TOP @pagesize * FROM TABLE_NAME WHERE id not in (SELECT TOP @pagesize*(@page-1) id FROM TABLE_NAME ORDER BY id) ORDER BY id。