最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

常見數(shù)據(jù)庫中SQL分頁語法整理大全(附示例)

 更新時間:2025年04月07日 09:51:35   作者:問題一籮筐  
數(shù)據(jù)庫分頁是數(shù)據(jù)庫管理系統(tǒng)中非常常見的一種操作,主要用于在大量數(shù)據(jù)中進(jìn)行高效的瀏覽,提高用戶體驗(yàn),這篇文章主要介紹了常見數(shù)據(jù)庫中SQL分頁語法整理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

MySQL分頁查詢

在MySQL中,分頁查詢通常使用 LIMIT 關(guān)鍵字來實(shí)現(xiàn)。

LIMIT [offset,] rows 其中,offset表示偏移量(從結(jié)果集的第幾行開始返回,默認(rèn)從 0 開始計(jì)數(shù)),rows表示要返回的行數(shù)。

常規(guī)版

# 查詢第一頁(假設(shè)每頁顯示 10 條記錄):
SELECT * FROM users LIMIT 0, 10; 
#這里0是偏移量,表示從第 1 行(偏移量為 0)開始,10是要返回的行數(shù)。

#查詢第二頁:
SELECT * FROM users LIMIT 10, 10;
#此時偏移量為10,即跳過前面 10 行,然后返回 10 行。

升級版

更靈活的分頁查詢如果你需要更靈活地處理分頁,可以使用變量來動態(tài)設(shè)置 offset 和 rows:

SET @page_size := 10;
SET @page_number := 2;
SET @offset := (@page_size * (@page_number - 1));

SELECT *
FROM employees
LIMIT @offset, @page_size;



# 在存儲過程中使用 LIMIT 進(jìn)行分頁查詢,以下是一個簡單的存儲過程示例,用于實(shí)現(xiàn)分頁查詢:
   DELIMITER $$
   CREATE PROCEDURE get_page(IN page_number INT, IN page_size INT)
   BEGIN
       SET @offset = (page_number - 1) * page_size;
       SET @limit = page_size;
       SET @sql = CONCAT('SELECT * FROM your_table LIMIT ', @offset, ', ', @limit);
       PREPARE stmt FROM @sql;
       EXECUTE stmt;
       DEALLOCATE PREPARE stmt;
   END$$
   DELIMITER ;

使用 JOIN 或子查詢進(jìn)行分頁有時候,你可能需要在復(fù)雜的查詢中進(jìn)行分頁,例如包含 JOIN 或子查詢:

SELECT e.*
FROM employees e
JOIN (
    SELECT employee_id
    FROM employees
    ORDER BY hire_date
    LIMIT @offset, @page_size
) as sub_query ON e.employee_id = sub_query.employee_id;

MySQL 8.0 引入了窗口函數(shù),可以使用 ROW_NUMBER() 來實(shí)現(xiàn)分頁:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY hire_date) as row_num
    FROM employees
) as paginated_results
WHERE row_num BETWEEN @offset + 1 AND @offset + @page_size;

Oracle分頁查詢

在Oracle數(shù)據(jù)庫中,分頁查詢通常使用ROWNUM偽列或者數(shù)據(jù)庫12c及更高版本中的FETCH FIRSTOFFSET子句來實(shí)現(xiàn)。

常規(guī)版

在Oracle 12c之前的版本,分頁查詢通常依賴于ROWNUM偽列。ROWNUM為結(jié)果集中的每一行分配一個唯一的行號。

SELECT * FROM (
  SELECT temp.*, ROWNUM rnum FROM (
    SELECT * FROM your_table WHERE conditions ORDER BY some_column
  ) temp WHERE ROWNUM <= :upper_bound
) WHERE rnum > :lower_bound;
# :upper_bound是上界值,通常是(頁碼 * 每頁顯示的行數(shù))。
# :lower_bound是下界值,通常是(頁碼 - 1) * 每頁顯示的行數(shù) + 1。

# 假設(shè)你有一個名為employees的表,你想查詢第2頁的數(shù)據(jù),每頁顯示10行數(shù)據(jù)。
SELECT * FROM (
  SELECT temp.*, ROWNUM rnum FROM (
    SELECT * FROM employees ORDER BY employee_id
  ) temp WHERE ROWNUM <= 20
) WHERE rnum > 10;

Oracle 12c及更高版本使用OFFSET和FETCH進(jìn)行分頁

SELECT *
FROM your_table
WHERE conditions
ORDER BY some_column
OFFSET :lower_bound ROWS FETCH NEXT :page_size ROWS ONLY;
# :lower_bound是分頁的起始行,通常是(頁碼 - 1) * 每頁顯示的行數(shù)。
# :page_size是每頁顯示的行數(shù)。

# 假設(shè)你有一個名為employees的表,你想查詢第2頁的數(shù)據(jù),每頁顯示10行數(shù)據(jù)。
SELECT *
FROM employees
ORDER BY employee_id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
# 這里,OFFSET 10 ROWS跳過前10行,F(xiàn)ETCH NEXT 10 ROWS ONLY則返回接下來的10行。

升級版

動態(tài)分頁查詢有時候我們可能需要根據(jù)用戶輸入或者業(yè)務(wù)邏輯動態(tài)地確定每頁顯示的記錄數(shù)和頁碼。

例如,假設(shè)我們有一個存儲過程,接受兩個參數(shù):p_page_number(頁碼)和p_page_size(每頁記錄數(shù))。

在這個存儲過程中,首先計(jì)算偏移量v_offset,然后在內(nèi)部子查詢中使用分析函數(shù)ROW_NUMBER()對表中的數(shù)據(jù)按照some_column(根據(jù)實(shí)際需求替換為排序依據(jù)的列)進(jìn)行排序和編號。接著在中層子查詢中根據(jù)計(jì)算得到的偏移量和每頁記錄數(shù)限制ROWNUM,最后在外層子查詢中根據(jù)rn(行號)篩選出真正需要的頁面數(shù)據(jù)。

   CREATE OR REPLACE PROCEDURE dynamic_paging(p_page_number IN NUMBER, p_page_size IN NUMBER) AS
       v_offset NUMBER := (p_page_number - 1) * p_page_size;
   BEGIN
       -- 使用分析函數(shù)和ROWNUM進(jìn)行分頁
       SELECT *
       FROM (
           SELECT t.*, ROWNUM rn
           FROM (
               SELECT col1, col2, col3, -- 這里列出實(shí)際表中的列
                   -- 使用分析函數(shù)(例如ROW_NUMBER)對數(shù)據(jù)進(jìn)行排序和編號
                   ROW_NUMBER() OVER (ORDER BY some_column) AS row_num
               FROM your_table
           ) t
           WHERE ROWNUM <= v_offset + p_page_size
       )
       WHERE rn > v_offset;
   END;

多表連接與分頁結(jié)合當(dāng)查詢涉及多個表連接時,分頁操作需要考慮連接結(jié)果的順序和數(shù)量。

假設(shè)有table1和table2兩個表,我們要查詢連接后的結(jié)果并進(jìn)行分頁。

這里先進(jìn)行table1和table2的連接操作,然后使用ORDER BY對連接結(jié)果進(jìn)行排序,接著在內(nèi)部子查詢中使用ROWNUM進(jìn)行初步的分頁篩選,最后在外層子查詢中根據(jù)行號rn進(jìn)行調(diào)整以得到正確的第一頁數(shù)據(jù)。對于多表連接的分頁查詢,確保連接的正確性以及排序的合理性是很重要的,這樣才能得到準(zhǔn)確的分頁結(jié)果。

   SELECT *
   FROM (
       SELECT t.*, ROWNUM rn
       FROM (
           SELECT col1, col2, col3 -- 這里列出連接后的列
           FROM table1
           JOIN table2 ON table1.key = table2.key
           ORDER BY some_column
       ) t
       WHERE ROWNUM <= 10
   )
   WHERE rn > 0;

分區(qū)表的分頁優(yōu)勢如果數(shù)據(jù)存儲在分區(qū)表中,可以利用分區(qū)的特性更高效地進(jìn)行分頁查詢。

假設(shè)我們有一個按照日期分區(qū)的表partitioned_table,要查詢某個日期分區(qū)內(nèi)的數(shù)據(jù)并進(jìn)行分頁。

通過指定分區(qū)名,可以直接在該分區(qū)內(nèi)進(jìn)行分頁查詢,減少了查詢的數(shù)據(jù)量,提高了查詢效率,尤其是在處理大型表時這種優(yōu)勢更加明顯。

   SELECT *
   FROM (
       SELECT t.*, ROWNUM rn
       FROM (
           SELECT col1, col2, col3
           FROM partitioned_table PARTITION (partition_name) -- 替換為實(shí)際分區(qū)名
           ORDER BY some_column
       ) t
       WHERE ROWNUM <= 10
   )
   WHERE rn > 0;

PostgreSQL分頁查詢

在PostgreSQL中,分頁查詢通常使用 LIMIT 和 OFFSET 子句來實(shí)現(xiàn)。這兩個子句可以限制查詢結(jié)果的數(shù)量,并指定返回結(jié)果的起始點(diǎn)。

常規(guī)版

使用 LIMIT 和 OFFSET 關(guān)鍵字

# column_name是用于排序的列(如果不指定排序順序,分頁結(jié)果可能會不穩(wěn)定),
# count 是要返回的行數(shù)(即每頁的行數(shù)),
# offset_value是偏移量(表示從結(jié)果集的第幾行開始返回)。
SELECT * FROM table_name WHERE condition ORDER BY column_name
LIMIT count OFFSET offset_value;


# 查詢第一頁(假設(shè)每頁顯示 10 條記錄)
# 這里查詢users表,按照user_id排序,返回前 10 條記錄(偏移量為 0 表示從第一行開始)。
SELECT * FROM users ORDER BY user_id LIMIT 10 OFFSET 0;


# 查詢第二頁
SELECT * FROM users ORDER BY user_id LIMIT 10 OFFSET 10;

使用 FETCH 和 OFFSET(PostgreSQL 8.4 及以上版本支持 FETCH)

SELECT * FROM your_table ORDER BY some_column OFFSET offset_value FETCH FIRST num_rows ROWS ONLY;

SELECT * FROM users ORDER BY user_id OFFSET 0 FETCH FIRST 10 ROWS ONLY;

SELECT * FROM users ORDER BY user_id OFFSET 10 FETCH FIRST 10 ROWS ONLY;

升級版

更靈活的分頁查詢

SET @page_size = 10;
SET @page_number = 2;
SET @offset = (@page_size * (@page_number - 1));

SELECT *
FROM employees
ORDER BY employee_id
LIMIT @page_size OFFSET @offset;


# 在這個函數(shù)中,根據(jù)傳入的頁碼p_page_number和每頁大小p_page_size構(gòu)建動態(tài) SQL 語句。
#然后使用RETURN QUERY EXECUTE執(zhí)行動態(tài) SQL 并返回結(jié)果。這種方式使得分頁查詢更加靈活,能夠適應(yīng)不同的需求。
CREATE OR REPLACE FUNCTION dynamic_paging(p_page_number INT, p_page_size INT)
    RETURNS SETOF your_table_type AS
$BODY$
DECLARE
    v_sql TEXT;
BEGIN
    v_sql := format('SELECT * FROM your_table ORDER BY some_column LIMIT %s OFFSET %s', p_page_size, (p_page_number - 1) * p_page_size);
    RETURN QUERY EXECUTE v_sql;
END;
$BODY$
LANGUAGE plpgsql;

多表連接后的分頁

# 當(dāng)查詢涉及多個表的連接時,分頁操作需要考慮連接結(jié)果集的順序和結(jié)構(gòu)。
# 例如,假設(shè)有三個表table1、table2和table3,要對它們連接后的結(jié)果進(jìn)行分頁:
   SELECT *
   FROM (
       SELECT sub.*, ROWNUM AS row_num
       FROM (
           SELECT t1.col1, t2.col2, t3.col3
           FROM table1 t1
               JOIN table2 t2 ON t1.key = t2.key
               JOIN table3 t3 ON t2.other_key = t3.other_key
           ORDER BY t1.some_column
       ) sub
   )
   WHERE row_num BETWEEN start_row AND end_row;
#首先在內(nèi)部子查詢中進(jìn)行多表連接并按照table1中的some_column排序。
#然后在中層子查詢中使用ROWNUM(這里ROWNUM類似 Oracle 中的概念,
#在 PostgreSQL 中是自定義的行號)為結(jié)果集編號。
#最后在外層子查詢中根據(jù)計(jì)算出的開始行start_row和結(jié)束行
#end_row(可以根據(jù)頁碼和每頁大小計(jì)算得出)進(jìn)行分頁篩選。

使用窗口函數(shù)進(jìn)行分頁PostgreSQL 8.4及以上版本支持窗口函數(shù),可以使用 row_number() 窗口函數(shù)來實(shí)現(xiàn)更復(fù)雜的分頁邏輯:

WITH paginated AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY employee_id) AS rn
  FROM employees
)
SELECT *
FROM paginated
WHERE rn BETWEEN 11 AND 20;


#窗口函數(shù)可以在不改變結(jié)果集行數(shù)的情況下對每一行進(jìn)行計(jì)算,這在復(fù)雜的分頁場景中很有用。
#例如,假設(shè)要對一個包含員工信息的表employees進(jìn)行分頁,并且在分頁結(jié)果中顯示每個員工在部門內(nèi)的排名:
SELECT department, employee_name, salary,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_department
FROM employees
ORDER BY department, rank_in_department
LIMIT page_size OFFSET offset;

# 這里使用ROW_NUMBER()窗口函數(shù)計(jì)算每個員工在其所屬部門內(nèi)按照薪資降序排列的排名。
# 然后按照部門和部門內(nèi)排名進(jìn)行排序,最后進(jìn)行分頁操作。這種方式可以在分頁結(jié)果中提供更多的信息和分析價值。

SQL Server分頁查詢

在 SQL Server 中,分頁查詢可以通過使用 OFFSET 和 FETCH 子句來實(shí)現(xiàn)。這些子句在 SQL Server 2012 及更高版本中被引入,提供了一種簡單且直觀的方式來進(jìn)行分頁。

常規(guī)版

使用OFFSET - FETCH子句(SQL Server 2012 及以上版本)

SELECT * FROM your_table ORDER BY some_column OFFSET offset_rows ROWS FETCH NEXT fetch_rows ROWS ONLY;
# 其中,your_table是要查詢的表名,
# some_column是用于排序的列(如果不指定排序順序,分頁結(jié)果可能會不穩(wěn)定),
# offset_rows是偏移量(表示從結(jié)果集的第幾行開始返回),
# fetch_rows是要返回的行數(shù)(即每頁的行數(shù))。

# 查詢第一頁(假設(shè)每頁顯示 10 條記錄)
SELECT * FROM users ORDER BY user_id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
#  查詢第二頁
SELECT * FROM users ORDER BY user_id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

使用TOP關(guān)鍵字結(jié)合子查詢(適用于舊版本)

# 查詢第一頁(假設(shè)每頁顯示 10 條記錄)
SELECT TOP 10 * FROM your_table ORDER BY some_column;
#  查詢第二頁(假設(shè)每頁顯示 10 條記錄)
# 這個方法相對復(fù)雜一些,在子查詢中獲取前 20 條記錄,然后通過外部查詢排除前 10 條記錄來得到第二頁的數(shù)據(jù)。
SELECT * FROM (
    SELECT TOP 20 * FROM your_table ORDER BY some_column
) AS subquery
WHERE NOT EXISTS (SELECT TOP 10 * FROM your_table ORDER BY some_column)
ORDER BY some_column;

升級版

使用動態(tài) SQL 實(shí)現(xiàn)靈活分頁

# 例如,創(chuàng)建一個存儲過程,接受頁碼@pageNumber和每頁行數(shù)@pageSize作為參數(shù):
   CREATE PROCEDURE DynamicPaging
       @pageNumber INT,
       @pageSize INT
   AS
   BEGIN
       DECLARE @sql NVARCHAR(MAX);
       SET @sql = N'SELECT * FROM (
                   SELECT *, ROW_NUMBER() OVER (ORDER BY some_column) AS row_num
                   FROM your_table
               ) AS subquery
               WHERE row_num BETWEEN ' + CAST((@pageNumber - 1) * @pageSize + 1 AS NVARCHAR(10)) + ' AND ' + CAST(@pageNumber * @pageSize AS NVARCHAR(10));
       EXEC sp_executesql @sql;
   END;
# 在這個存儲過程中,首先構(gòu)建動態(tài) SQL 語句。使用ROW_NUMBER()函數(shù)為結(jié)果集中的每一行分配一個行號(按照some_column排序),
# 然后根據(jù)傳入的頁碼和每頁行數(shù)計(jì)算出要獲取的行號范圍,最后通過sp_executesql執(zhí)行動態(tài) SQL 語句來實(shí)現(xiàn)分頁查詢。

多表連接后的分頁

# 例如,假設(shè)有表table1和table2,要對它們連接后的結(jié)果進(jìn)行分頁:
   SELECT *
   FROM (
       SELECT sub.*, ROW_NUMBER() OVER (ORDER BY some_column) AS row_num
       FROM (
           SELECT t1.col1, t2.col2
           FROM table1 t1
               JOIN table2 t2 ON t1.key = t2.key
           ORDER BY some_column
       ) AS sub
   ) AS final
   WHERE row_num BETWEEN start_row AND end_row;
# 首先在內(nèi)部子查詢中進(jìn)行table1和table2的連接,并按照some_column排序。
#然后在中層子查詢中使用ROW_NUMBER()函數(shù)為連接后的結(jié)果集分配行號。
#最后在外層子查詢中根據(jù)計(jì)算出的起始行start_row和結(jié)束行
#end_row(可以根據(jù)頁碼和每頁行數(shù)計(jì)算得出)進(jìn)行分頁篩選。

與窗口函數(shù)結(jié)合的分頁查詢

# 例如,要查詢員工表employees中的數(shù)據(jù)并進(jìn)行分頁,同時顯示每個部門內(nèi)員工的排名:
   SELECT department, employee_name, salary,
          ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_department
   FROM employees
   ORDER BY department, rank_in_department
   OFFSET offset_rows ROWS FETCH NEXT fetch_rows ROWS ONLY;
#這里使用ROW_NUMBER()窗口函數(shù)在每個部門內(nèi)按照薪資降序?yàn)閱T工分配排名。
#然后按照部門和部門內(nèi)排名進(jìn)行排序,最后再進(jìn)行分頁操作。這種方式可以在分頁結(jié)果中提供更詳細(xì)的部門內(nèi)員工信息。

總結(jié) 

到此這篇關(guān)于常見數(shù)據(jù)庫中SQL分頁語法整理大全的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫SQL分頁語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL創(chuàng)建用戶的三種方法

    MySQL創(chuàng)建用戶的三種方法

    在對MySQL的日常管理和操作中,為了避免有人惡意使用root用戶控制數(shù)據(jù)庫,盡可能地不用或少用 root 用戶登錄系統(tǒng),本文主要介紹了MySQL創(chuàng)建用戶的三種方法,感興趣的可以了解一下
    2023-08-08
  • MySQL無法修改主鍵的問題分析及解決方案

    MySQL無法修改主鍵的問題分析及解決方案

    最近同事咨詢了一個問題,TDSQL(for MySQL)中的某張表主鍵需要改為聯(lián)合主鍵,是否必須先刪除現(xiàn)有的主鍵?因?yàn)閯h除主鍵時,提示這個錯誤,所以本文給大家介紹了MySQL無法修改主鍵的問題分析及解決方案,需要的朋友可以參考下
    2024-01-01
  • Mysql 5.7.14 使用常見問題匯總(推薦)

    Mysql 5.7.14 使用常見問題匯總(推薦)

    本文給大家分享Mysql 5.7.14 使用常見問題匯總的相關(guān)知識及結(jié)合自己的實(shí)踐總結(jié)了相關(guān)原因,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • MySQL表添加某一列和刪除某一列的方法

    MySQL表添加某一列和刪除某一列的方法

    MySQL是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它是一種開源的軟件,由瑞典的MySQL?AB公司開發(fā)的,這篇文章主要介紹了關(guān)于MySQL表添加某一列和刪除某一列的sql語句,需要的朋友可以參考下
    2023-06-06
  • centos7.2下安裝mysql5.7數(shù)據(jù)庫的命令詳解

    centos7.2下安裝mysql5.7數(shù)據(jù)庫的命令詳解

    這篇文章主要介紹了centos7.2下安裝mysql5.7數(shù)據(jù)庫,文中給出了所有的命令,按照命令執(zhí)行就會安裝上 ,需要的朋友可以參考下
    2019-07-07
  • Centos 5.2下安裝多個mysql數(shù)據(jù)庫配置詳解

    Centos 5.2下安裝多個mysql數(shù)據(jù)庫配置詳解

    在實(shí)際應(yīng)用中,有時候,我們需要在同一臺服務(wù)器上安裝兩個甚至多個mysql數(shù)據(jù)庫,那么,如何來操作呢,今天我們就來探討下這個問題
    2014-07-07
  • mysql查詢鎖表的實(shí)現(xiàn)方法

    mysql查詢鎖表的實(shí)現(xiàn)方法

    本文主要介紹了mysql查詢鎖表的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • MySQL筆記之子查詢使用介紹

    MySQL筆記之子查詢使用介紹

    子查詢是將一個查詢語句嵌套在另一個查詢語句中,內(nèi)層查詢語句的查詢結(jié)果,可以為外層查詢語句提供查詢條件
    2013-05-05
  • MySQL配置了雙主,是如何避免出現(xiàn)數(shù)據(jù)回環(huán)沖突的

    MySQL配置了雙主,是如何避免出現(xiàn)數(shù)據(jù)回環(huán)沖突的

    這篇文章主要介紹了MySQL配置了雙主,是如何避免出現(xiàn)數(shù)據(jù)回環(huán)沖突的,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • MySQL查詢條件常見用法詳解

    MySQL查詢條件常見用法詳解

    這篇文章主要介紹了MySQL查詢條件常見用法,結(jié)合實(shí)例形式總結(jié)分析了MySQL常見的各類查詢條件與簡單使用方法,需要的朋友可以參考下
    2019-11-11

最新評論

仁怀市| 湘阴县| 抚松县| 宝鸡市| 黄浦区| 玛沁县| 洪湖市| 龙口市| 台北县| 十堰市| 牡丹江市| 杭锦后旗| 武胜县| 阳新县| 昌吉市| 高邮市| 尉犁县| 鄂伦春自治旗| 沅江市| 柳州市| 铜鼓县| 大同县| 武胜县| 洛南县| 旅游| 南陵县| 洛宁县| 和硕县| 和平区| 清河县| 枣阳市| 祁东县| 轮台县| 安西县| 炉霍县| 奈曼旗| 凤凰县| 通许县| 胶南市| 金坛市| 景谷|