摘要: 在本教程中,你將學習如何使用 PostgreSQL
的 FETCH
子句從查詢中檢索部分行。
PostgreSQL FETCH
簡介
在 PostgreSQL
中,OFFSET
子句的作用類似于 LIMIT
子句。FETCH
子句允許你限制查詢返回的行數。
LIMIT
子句并非 SQL
標準的一部分。不過,FETCH
子句是 SQL:2008
標準的一部分。如果您希望您的應用程序在未來支持其他數據庫,請使用 FETCH
而非 LIMIT
,因為其他數據庫供應商很可能會支持它。
以下是 OFFSET FETCH
子句的語法:
SELECT column1, column2
FROM table_name
ORDER BY sort_expression
OFFSET skip_count
FETCH { FIRST | NEXT } ] [row_count] {ROW | ROWS } ONLY;
在此語法中:
首先,在 FROM
子句中指定你想要檢索數據的表的名稱。
其次,在 SELECT
子句中限制最終結果集中要包含的行中的哪些列。
第三,使用 ORDER BY
子句按一列或多列中的值對行進行排序。
第四,在 FETCH
子句返回行的子集之前,在 OFFSET
子句中提供要跳過的行數:
OFFSET skip_count
skip_count
用于確定要跳過的行數。它可以是零或正整數。如果 skip_count
為零,查詢將不會跳過任何行。
OFFSET
子句是可選的。如果省略該子句,查詢也不會跳過任何行。
第五,在 FETCH
子句中設置要返回的行數 (row_count)
。
row_count
的默認值為 1,這意味著如果省略它,FETCH
將從查詢中返回一行數據。
你可以交替使用 FIRST
和 NEXT
、ROW
以及 ROWS
,因為它們是同義詞。
例如:
FETCH FIRST 1 ROW ONLY;
FETCH FIRST ROW ONLY;
FETCH FIRST 10 ROWS ONLY;
FETCH NEXT 1 ROW ONLY;
FETCH NEXT ROW ONLY;
FETCH NEXT 10 ROWS ONLY;
設置示例表
我們將使用在 LIMIT
教程中創建的 products
表來練習 FETCH
子句。
以下是創建 products
表并插入一些行的SQL腳本。
CREATE TABLE products (product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name VARCHAR(255) NOT NULL,price DECIMAL(10, 2)
);INSERT INTOproducts (name, price)
VALUES('iPhone 16 Pro Max', 1649.00),('iPhone 16', 829.00),('Galaxy S24 Ultra', 1299.99),('Galaxy S24 FE', 949.99),('Pixel 9 Pro', 799.00),('Pixel 8a', 399.00),('OnePlus 12', 745.00),('OnePlus Open', 1514.99),('Galaxy Z Fold 6', 2019.99);
product_id | name | price |
---|---|---|
1 | iPhone 16 Pro Max | 1649.00 |
2 | iPhone 16 | 829.00 |
3 | Galaxy S24 Ultra | 1299.99 |
4 | Galaxy S24 FE | 949.99 |
5 | Pixel 9 Pro | 799.00 |
6 | Pixel 8a | 399.00 |
7 | OnePlus 12 | 745.00 |
8 | OnePlus Open | 1514.99 |
9 | Galaxy Z Fold 6 | 2019.99 |
獲取第一行
以下語句使用 FETCH
子句從 products
表中查詢最昂貴的產品:
SELECTname,price
FROMproducts
ORDER BYprice DESC
FETCH FIRST ROW ONLY;
輸出:
name | price
-----------------+---------Galaxy Z Fold 6 | 2019.99
獲取一些行
以下示例使用 FETCH
子句從 products
表中檢索價格最高的三種產品:
SELECTname,price
FROMproducts
ORDER BYprice DESC
FETCH FIRST 3 ROWS ONLY;
輸出:
name | price
-------------------+---------Galaxy Z Fold 6 | 2019.99iPhone 16 Pro Max | 1649.00OnePlus Open | 1514.99
在獲取之前跳過一些行
以下語句使用 OFFSET
和 FETCH
子句從 products
表中獲取第二貴的產品:
SELECTname,price
FROMproducts
ORDER BYprice DESC
OFFSET 1
FETCH NEXT 1 ROW ONLY;
輸出:
name | price
-------------------+---------iPhone 16 Pro Max | 1649.00
使用 PostgreSQL
的 FETCH
子句進行分頁
FETCH
子句有助于實現分頁:
OFFSET record_per_page * (page_no - 1)
FETCH NEXT record_per_page ROWS ONLY.
在此語法中:
record_per_page
是每頁的記錄數量。page_no
是頁碼,例如1、2、3
。
假設你希望每頁顯示3個產品 (record_per_page)
,并想獲取第2頁的產品 (page_no)
,你可以使用以下查詢:
SELECTname,price
FROMproducts
ORDER BYprice DESC
OFFSET 3 * (2 - 1)
FETCH NEXT 3 ROW ONLY;
輸出:
name | price
------------------+---------Galaxy S24 Ultra | 1299.99Galaxy S24 FE | 949.99iPhone 16 | 829.00
總結
- 使用
PostgreSQL
的FETCH
從查詢中返回部分行。 - 使用
OFFSET FETCH
在返回部分行之前跳過一些行。