當前位置:首頁 » 編程語言 » 不用sql分頁
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

不用sql分頁

發布時間: 2022-06-24 17:40:25

㈠ 如何使用sql語句進行分頁操作

sql語句是不能進行分頁操作的,它只查出一個相應條件的數據記錄集。而分頁操作,是由程序員用相應的軟體開發語言設計演算法,而過進行分頁操作。謝謝

㈡ 我不想在SQL 語句或 存儲過程中插入分頁代碼

不在SQL 語句或 存儲過程中插入分頁代碼
不管再用什麼方法,都得把所有數據先全部查出來再處理
所以,要優化分頁,只能從資料庫中優化

㈢ 幾種常見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() 的變體基於這個測試效率實在不好。

㈣ asp+access 中怎樣把所有符合SQL語句條件的記錄都顯示出來(不用分頁的),具體的代碼怎麼寫越簡單越好

sql="select * from biao where tianjian"
rs.open sql,conn,1,1
if not rs.eof then
do while not rs.eof
response.write"neirong"
rs.movenext
loop
else
response.write"還沒有記錄!"
end if

㈤ 用了hibernate是不是就不用寫sql語句了,直接調用裡面封裝好的分頁還要自己再寫嗎

hibernate有一個跟sql非常類似的語句 叫HQL語句,所以。。你還是得寫。但是hibernate提供了很多方便的方法

㈥ SQL如何實現數據分頁,要具體語句,謝謝

可以的,用存儲過程

分頁存儲過程如下

CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@RetColumns varchar(1000) = '*', -- 需要返回的列,默認為全部
@Orderfld varchar(255), -- 排序欄位名
@PageSize int = 10, -- 頁尺寸
@PageIndex int = 1, -- 頁碼
@IsCount bit = 0, -- 返回記錄總數, 非 0 值則返回
@OrderType varchar(50) = 'asc', -- 設置排序類型, 非 asc 值則降序
@strWhere varchar(1000) = '' -- 查詢條件 (注意: 不要加 where)
AS

declare @strSQL varchar(1000) -- 主語句
declare @strTmp varchar(300) -- 臨時變數
declare @strOrder varchar(400) -- 排序類型

if @IsCount != 0 --執行總數統計

begin
if @strWhere != ''
set @strSQL = "select count(*) as Total from [" + @tblName + "] where " + @strWhere
else
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end

else --執行查詢操作

begin

if @OrderType != 'asc'
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @Orderfld +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @Orderfld +"] asc"
end

set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrder

if @strWhere != ''
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "] where (" + @strWhere + ") "
+ @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder

if @PageIndex = 1
begin
set @strTmp = ""
if @strWhere != ''
set @strTmp = " where (" + @strWhere + ")"

set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end
end

exec (@strSQL)

㈦ 不用sql語句怎麼進行分頁

可以過濾啊。
你的希望應該是:有一個5000條記錄的集合,希望能從指定位置開始獲取指定數量的一個連續的子集吧?
如果你用LinQ可以使用下面的代碼
public IEnumable GetData(IEnumable source, int startIndex, int size)
{
return source.Skip(startIndex).Take(size);
}
如果你用的不是LinQ,那麼:
public IEnumable GetData(IEnumable source, int startIndex, int size)
{
int index = 0;
foreach(var item in source)
{
if(index < startIndex)
{
continue;
}
if(index - startIndex > size)
{
break;
}
yield return item;
}
當然,上面的枚舉方法不是很好,不過,一般的情況下,你的集合應該能確定類型,比如是LIST或ARRAY等,也就是說能進行下標索引的,此時就更簡單了,下面的代碼就用數組來實現:
public IEnumable GetData(object[] source, int startIndex, int size)
{
for(int i = startIndex; i < startIndex + size && i < source.Length; i++)
{
yield return source[i];
}
}

㈧ GridView若不使用SqlDataSource控制項如何實現自動分頁功能 ASP.NET

實現IDataSource的GetView方法,返回的DataSourceView的CanPage屬性必須位true就可以了

㈨ sql分頁,不用存儲過程

這個要看資料庫來得,
不同的資料庫,
處理機制不一樣。
例如:
要求
查詢
SALE_REPORT
表中,每日銷售金額(SALE_MONEY)合計最大的10條數據,要求按從大到小,取第11條到第20條。
對於
Oracle
資料庫,
一般是用
ROWNUM
來處理。
SELECT
*
FROM
(
SELECT
ROWNUM
AS
NO,
A.SALE_DATE,
A.SUM_MONEY
FROM
(
SELECT
SALE_DATE,
SUM(SALE_MONEY)
AS
SUM_MONEY
FROM
SALE_REPORT
GROUP
BY
SALE_DATE
ORDER
BY
SUM(SALE_MONEY)
DESC
)
A
)
B
WHERE
B.NO
BETWEEN
11
AND
20
對於
SQL
Server
來說,
一般是使用
2個
Top
來處理
SELECT
TOP
10
top20.*
FROM
(
SELECT
TOP
20
SALE_DATE,
SUM(SALE_MONEY)
AS
SUM_MONEY
FROM
SALE_REPORT
GROUP
BY
SALE_DATE
ORDER
BY
SALE_DATE
DESC
)
AS
top20
ORDER
BY
top20.SALE_DATE
ASC
對於
Mysql
來說,

Limit
真是
安逸啊
SELECT
SALE_DATE,
SUM(SALE_MONEY)
AS
SUM_MONEY
FROM
SALE_REPORT
GROUP
BY
SALE_DATE
ORDER
BY
SUM(SALE_MONEY)
DESC
LIMIT
11,
10

㈩ 不使用資料庫怎麼在頁面上實現分頁顯示

一.邏輯分頁

1.邏輯分頁的第一種方式,利用ResultSet的滾動分頁。步驟如下:
a.根據條件sql查詢資料庫。
b.得到ResultSet的結果集,由於ResultSet帶有游標,因此可以使用其next()方法來指向下一條記錄。
c.利用next()方法,得到分頁所需的結果集。

這種分頁方式依靠的是對結果集的演算法來分頁,因此通常被稱為「邏輯分頁」。

代碼如下:

/**
* TestPageResultSetDAO.java
*
* Copyright 2008. All Rights Reserved.
*/
package com.cosmow.pageresultset.;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cosmow.pageresultset.entity.Bars;

/**
* TODO class TestPageResultSetDAO
*
* Revision History
*
* 2008-7-7,Cosmo,created it
*/
public class TestPageResultSetDAO {

private final String FIND_BARS_PAGE = "SELECT * FROM YYBARS ORDER BY id";

/**
* 提供JDBC連接方法,返回一個Connection的實例
*
* @return
* @throws SQLException
*/
private Connection getConnection() throws SQLException {
try {
final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
final String user = "store";
final String password = "store_password";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
return con;
} catch (ClassNotFoundException e) {
throw new SQLException(e.getMessage());
}
}

/**
* 邏輯分頁方法一,該方法使用移位(rs.next)來進行
*
* @param currentPage
* 當前頁
* @param showRows
* 一頁顯示的數據量
*/
public List<Bars> pageListOne(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_PAGE);
rs = ps.executeQuery();
// 過濾結果集的變數
int skipBegin = (currentPage - 1) * showRows;
int skipEnd = currentPage * showRows;
// 翻頁計數器
int currentNum = 0;
// 當返回結果集中有記錄時
while (rs.next()) {
// 以下情況將保證在結果集中有記錄時的應用
if (currentNum >= skipBegin && currentNum < skipEnd) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
if (currentNum == skipEnd - 1)
break;
}
currentNum++;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
}

2.邏輯分頁的第二種方式
利用Scrollable ResultSets(可滾動結果集合)來快速定位到某個游標所指定的記錄行,所使用的是ResultSet的absolute()方法。
改進代碼如下:
/**
* TestPageResultSetDAO.java
*
* Copyright 2008. All Rights Reserved.
*/
package com.cosmow.pageresultset.;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cosmow.pageresultset.entity.Bars;

/**
* TODO class TestPageResultSetDAO
*
* Revision History
*
* 2008-7-7,Cosmo,created it
*/
public class TestPageResultSetDAO {

private final String FIND_BARS_PAGE = "SELECT * FROM YYBARS ORDER BY id";

/**
* 提供JDBC連接方法,返回一個Connection的實例
*
* @return
* @throws SQLException
*/
private Connection getConnection() throws SQLException {
try {
final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
final String user = "store";
final String password = "store_password";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
return con;
} catch (ClassNotFoundException e) {
throw new SQLException(e.getMessage());
}
}

/**
* 邏輯分頁方法二,使用absolute()方法分頁
*
* @param currentPage
* 當前頁
* @param showRows
* 一頁顯示的數據量
*/
public List<Bars> pageListTwo(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_PAGE);
rs = ps.executeQuery();

// 過濾結果集的變數
int skipBegin = (currentPage - 1) * showRows;
int skipEnd = currentPage * showRows;
// 利用rs.absolute進行定位
if (!rs.absolute(skipBegin))
return resultList;
// 當返回結果集中有記錄時
while (rs.next()) {
// 以下情況將保證在結果集中有記錄時的應用
if (skipBegin < skipEnd) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
if (skipBegin == skipEnd - 1)
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
}

雖然和第一種方式區別不大,單效率比ResultSet滾動要好,但是absolute()方法並不是所有jdbc驅動都支持。
可用如下代碼測試當前jdbc驅動是否支持可滾動結果集:

int type = rs.getType();
if (type == ResultSet.TYPE_SCROLL_INSENSITIVE || type == ResultSet.TYPE_SCROLL_SENSITIVE)
System.out.println("Result set is scrollable");
else
System.out.println("Result set is not scrollable");

二.物理分頁
利用資料庫本身的一些特性來分頁。即:利用了資料庫對sql語法的優化,提高分頁性能。
1.針對Oracle資料庫
步驟如下:
a.根據所使用的資料庫特性來組織sql進行分頁。
b.每次跳轉頁面的sql查詢都不相同。
通用的sql分頁方式,「限制行數結果集的倒序」分頁,步驟如下:
(1).取得符合條件的所有結果集中可以唯一標識的Key值(通常是主鍵),並正向排序。
(2).利用資料庫提供的特殊方法進行「最大結果集」的限制(在Oracle中使用rownum, sql server中使用top, mysql中使用limit...),
該「最大結果集」指包含當前所處頁的所有記錄數,「最大結果集」應該只包含惟一的Key值。
(3).對步驟(2)中的「最大結果集」進行逆序,並取得「顯示當前頁顯示數量的結果集」,該結果集中只包含惟一的Key值。
(4).通過步驟(3)中所取得的Key值取得顯示數據,該顯示數據就是當前頁應該顯示的數據。

2.針對MySQL資料庫
在MySQL資料庫中offset關鍵字的意思是"越過",而limit關鍵字的意思是「限制」,利用這兩者結合可輕松分頁。
(1)取得符合條件的結果集,包含全欄位。
(2)利用offset關鍵字越過一段結果集(被越過的結果集就是"(當前頁 - 1) * 一頁顯示數")。
(3)利用limit關鍵字限製取得一段結果集(被限製取得的結果集就是一頁顯示數)

代碼如下:

/**
* TestPageResultSetDAO.java
*
* Copyright 2008. All Rights Reserved.
*/
package com.cosmow.pageresultset.;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cosmow.pageresultset.entity.Bars;

/**
* TODO class TestPageResultSetDAO
*
* Revision History
*
* 2008-7-7,Cosmo,created it
*/
public class TestPageResultSetDAO {

private final String FIND_BARS_MYSQL = "select * from yybars order by id limit ? offset ?";

/**
* 提供JDBC連接方法,返回一個Connection的實例
*
* @return
* @throws SQLException
*/
private Connection getConnection() throws SQLException {
try {
final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
final String user = "store";
final String password = "store_password";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
return con;
} catch (ClassNotFoundException e) {
throw new SQLException(e.getMessage());
}
}

/**
* 物理分頁方法二針對mysql,使用sql語句的limit和offset來進行分頁
*
* @param currentPage
* 當前頁
* @param showRows
* 一頁顯示的數據量
*/
public List<Bars> pageListFour(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_MYSQL);
//傳入參數,第一個參數表示顯示幾條記錄(limit關鍵字的含義)
ps.setInt(1, showRows);
//第二個參數表示丟棄幾條記錄(offset關鍵字的含義)
ps.setInt(2, showRows * (currentPage - 1));
rs = ps.executeQuery();
// 當返回結果集中有記錄時
while (rs.next()) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
}

分頁結論:
1.物理分頁速度上並不一定快於邏輯分頁,邏輯分頁速度上也並不一定快於物理分頁。
2.物理分頁總是優於邏輯分頁:沒有必要將屬於資料庫端的壓力加諸到應用端來,就算速度上存在優勢,
然而其它性能上的優點足以彌補這個缺點。
3.在分頁工作前,有必要了解使用資料庫本身的一些sql語句特點更好的分頁。

分頁方法有很多,主要看哪種符合你的要求。

希望我的回答對你有幫助,若幫助到您請及時的採納
及時不採納也請贊同下,讓咱有繼續回答的動力哈