⑴ sql 大量數據分表查詢
可以,這個就像你分頁的時候,當一個表的數據量太大, 你就不可能一次性全查出來,得規定查出多少條,然後下一頁的時候再是後面多少條,具體實現就自己寫了。我這里給你個分頁的SQL,oracle的分頁。
SELECT * FROM (
SELECT a.*, ROWNUM rm FROM(
SELECT * FROM tableName
) a WHERE ROWNUM <=10
) WHERE rm>5
這里是查出6~10條數據,你可以按這個思路去做做。
⑵ 資料庫在進行水平分表之後,sql查詢分頁該怎麼進行
1.如果只是為了分頁,可以考慮這種分表,就是表的id是范圍性的,且id是連續的,比如第一張表id是1到10萬,第二張是10萬到20萬,這樣分頁應該沒什麼問題。
2.如果是其他的分表方式,建議用sphinx先建索引,然後查詢分頁,我們公司現在就是這樣乾的
⑶ SQL分頁的幾種方法
方法一 使用offset fetch next(2012版本及以上版本才可以使用)
方法二 使用row_number()函數
利用row_number() over(order by id desc)函數計算出行數,選定相應的行數返回即可(2005版本以上才可以使用)
使用存儲過程封裝
⑷ sql分頁顯示的問題
lz,這個問題其實和普通的分頁問題是一樣的,只是規則不同而已,普通的分頁是以每頁條數來分的,比如每頁20條,正排前20條,倒排前20條,這樣兩頁的數據就出來了,這樣通過拼接sql可以完成,這種分頁函數方法,網上多了去了。你這個問題呢只是變了角度,其實本質是一樣的,你這里是以分類數來決定分頁。我寫個簡單的sql給你看一下
createtable1121
(idchar(1));
insertinto1121
select'A'
UNIONALL
SELECT'A'
UNIONALL
SELECT'B'
UNIONALL
SELECT'B'
UNIONALL
SELECT'C'
UNIONALL
SELECT'D'
UNIONALL
SELECT'D'
UNIONALL
SELECT'E'
UNIONALL
SELECT'E'
UNIONALL
SELECT'E'
UNIONALL
SELECT'F'
UNIONALL
SELECT'G';
SELECTT1.id,T2.RNFROM1121T1,
(SELECTT.ID,ROW_NUMBER()OVER(ORDERBYID)RNFROM(
SELECTDISTINCTIDFROM1121)T)T2WHERET1.ID=T2.id;
--結果
A 1
A 1
B 2
B 2
C 3
D 4
D 4
E 5
E 5
E 5
F 6
G 7
或者還可以這樣
SELECTT1.id,T2.RN%3+1FROM1121T1,
(SELECTT.ID,ROW_NUMBER()OVER(ORDERBYID)RNFROM(
SELECTDISTINCTIDFROM1121)T)T2WHERET1.ID=T2.id;
--結果
A 2
A 2
B 3
B 3
C 1
D 2
D 2
E 3
E 3
E 3
F 1
G 2
這樣寫希望對你理解有幫助,有問題再追問吧,望採納。
⑸ 幾種常見SQL分頁方式
createtablepagetest
(
idintidentity(1,1)notnull,
col01intnull,
col02nvarchar(50)null,
col03datetimenull
)
--分頁1,notin/top
selecttop50*frompagetest
whereidnotin()
orderbyid
--分頁2,notexists
selecttop50*frompagetest
wherenotexists
(select1from()awherea.id=pagetest.id)
orderbyid
--寫法3,max/top
selecttop50*frompagetest
whereid>(selectmax(id)from()a)
orderbyid
--分頁4,row_number()
selecttop50*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900andrownumber<9951
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
--分頁5,在csdn上一帖子看到的,row_number()變體,不基於已有欄位產生記錄序號,先按條件篩選以及排好序,再在結果集上給一常量列用於產生記錄序號
select*
from(
selectrow_number()over(orderbytempColumn)rownumber,*
from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a
)b
whererownumber>9900
結論:
1.max/top,ROW_NUMBER()都是比較不錯的分頁方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同時適用於sql2000,access。
2.not exists感覺是要比not in效率高一點點。
3.ROW_NUMBER()的3種不同寫法效率看起來差不多。
4.ROW_NUMBER() 的變體基於這個測試效率實在不好。
⑹ SQL的幾種分頁演算法
利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。
⑺ 如何用sql語句 實現分頁查詢
分頁:一般會把當前頁通過get方式傳遞,PHP通過$_GET['page']接收。
查詢:可以從當前乘以每頁顯示數通過limit來實現分頁效果。
//每頁顯示條數
$pageSize=10;
//當前頁
$_GET['page']?$page=1:$page=$_GET['page'];
//開始查詢位置
$seat=$page*$pageSize;
//sql語句
$sql="select*fromtablelimit$seat,$pageSize";
//輸出數據到view即可
⑻ 怎麼使用sql server 按條件查詢的結果分頁顯示求大神給代碼
盡量不要使用嵌套子查詢,優先使用連接子查詢;
In 關鍵字盡量少使用,效率低,除非 in 包含的信息量非常少,並且叫固定;
如果查詢條件和查詢結果表無直接關聯,優先根據查詢條件查詢出符合條件的臨時結果值,然後和最終結果表關聯;
除 top n 方式分頁之外,使用 row_number() over 方式分頁也可以;
能明確指定結果欄位的,盡量不要用 * ;
不相關的欄位可以省略;
如果最終結果表數據比較大,考慮分表,分區,分庫;
查詢結果表欄位盡量不要包含大文本之類的欄位;
where 條件中對於varchar 欄位 的 like 查詢要適度,不要用太多,會影響效率;
⑼ 用SQL語句怎麼實現資料庫分頁
CREATE PROC sp_PageView
@tbname sysname, --要分頁顯示的表名
@FieldKey nvarchar(1000), --用於定位記錄的主鍵(惟一鍵)欄位,可以是逗號分隔的多個欄位
@PageCurrent int=1, --要顯示的頁碼
@PageSize int=10, --每頁的大小(記錄數)
@FieldShow nvarchar(1000)='', --以逗號分隔的要顯示的欄位列表,如果不指定,則顯示所有欄位
@FieldOrder nvarchar(1000)='', --以逗號分隔的排序欄位列表,可以指定在欄位後面指定DESC/ASC用於指定排序順序
@Where nvarchar(1000)='', --查詢條件
@PageCount int OUTPUT --總頁數
AS
SET NOCOUNT ON
--檢查對象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'對象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、視圖或者表值函數',1,16,@tbname)
RETURN
END
--分頁欄位檢查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',1,16)
RETURN
END
--其他參數檢查及規范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'
--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以後調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@PageCount賦值)
IF @PageCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END
--計算分頁顯示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=@PageCurrent*@PageSize
--第一頁直接顯示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--生成主鍵(惟一鍵)處理條件
DECLARE @Where1 nvarchar(4000),@s nvarchar(1000)
SELECT @Where1=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1
+N' AND a.'+LEFT(@s,CHARINDEX(N',',@s)-1)
+N'='+LEFT(@s,CHARINDEX(N',',@s)-1)
SELECT @Where1=STUFF(@Where1+N' AND a.'+@s+N'='+@s,1,5,N''),
@TopN=@TopN1-@PageSize
--執行查詢
EXEC(N'SET ROWCOUNT '+@TopN1
+N' SELECT '+@FieldKey
+N' INTO # FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder
+N' SET ROWCOUNT '+@TopN
+N' DELETE FROM #'
+N' SELECT '+@FieldShow
+N' FROM '+@tbname
+N' a WHERE EXISTS(SELECT * FROM # WHERE '+@Where1
+N') '+@FieldOrder)
END
⑽ 如何用sql語句 實現分頁查詢
適用於 SQL Server 2000/2005
SELECT TOP 頁大小 *
FROM table1
WHERE id NOT IN
SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id