㈠ 如何使用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語句特點更好的分頁。
分頁方法有很多,主要看哪種符合你的要求。
希望我的回答對你有幫助,若幫助到您請及時的採納
及時不採納也請贊同下,讓咱有繼續回答的動力哈
