SQL - TOP 子句



SQL TOP 子句

當我們從 SQL 表中檢索資料時,SQL 的TOP 子句用於限制 SQL Server 中 SELECT 查詢返回的行數。此外,我們還可以將其與 UPDATE 和 DELETE 語句一起使用以限制(約束)結果記錄。

例如,如果資料庫表中儲存了大量資料,而您只想對前 N 行執行操作,則可以在 SQL Server 查詢中使用 TOP 子句。

MySQL 資料庫不支援 TOP 子句,可以改用LIMIT子句從 MySQL 表中選擇有限數量的記錄。類似地,Oracle 支援 ROWNUM 子句來限制表的記錄。TOP 子句類似於 LIMIT 子句。

語法

SQL TOP 子句的基本語法如下:

SELECT TOP value column_name(s)
FROM table_name
WHERE [condition]

其中,value 是從頂部返回的行數/百分比。

示例

為了更好地理解它,讓我們考慮 CUSTOMERS 表,該表包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和工資等,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

現在,使用 INSERT 語句將值插入此表:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

表將建立如下:

ID 姓名 年齡 地址 工資
1 Ramesh 32 32 2000.00
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00
4 Delhi 25 15000 6500.00
5 Kaushik 27 23 8500.00
6 Kota 22 20000 4500.00
7 Chaitali 24 28 10000.00

現在,我們使用 TOP 子句從 CUSTOMERS 表中獲取前 4 條記錄,無需指定任何條件子句,例如 WHERE、ORDER BY 等:

SELECT TOP 4 * FROM CUSTOMERS;

輸出

這將產生以下結果:

ID 姓名 年齡 地址 工資
1 Ramesh 32 32 2000.00
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00
4 Delhi 25 15000 6500.00

帶有 ORDER BY 子句的 TOP

SQL 中的 ORDER BY 子句用於按升序或降序對查詢的結果集進行排序。我們可以將其與 TOP 子句一起使用以按排序順序檢索(或更新或刪除等)前 N 條記錄。

示例

使用以下查詢,我們按排序順序檢索 CUSTOMERS 表的前 4 條記錄。在這裡,我們根據 SALARY 列按降序對錶進行排序:

SELECT TOP 4 * FROM CUSTOMERS ORDER BY SALARY DESC;

輸出

我們得到的結果如下:

ID 姓名 年齡 地址 工資
7 Chaitali 24 28 10000.00
5 Kaushik 27 23 8500.00
4 Delhi 25 15000 6500.00
6 Kota 22 20000 4500.00

注意:預設情況下,ORDER BY 子句按升序對資料進行排序。因此,如果需要按降序對資料進行排序,則必須使用 DESC 關鍵字。

帶有百分比的 TOP 子句

我們還可以透過使用 PERCENT 子句以及 TOP 子句,指定百分比值而不是數字來限制記錄。

示例

以下查詢按工資升序選擇 CUSTOMERS 表中前 40% 的記錄:

SELECT TOP 40 PERCENT * FROM CUSTOMERS ORDER BY SALARY

輸出

我們的表共有 7 條記錄。因此,7 的 40% 是 2.8。因此,SQL Server 將結果四捨五入到三行(下一個整數),如下面的輸出所示:

ID 姓名 年齡 地址 工資
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00
1 Ramesh 32 32 2000.00

帶有 WHERE 子句的 TOP

我們可以將 TOP 子句與 WHERE 子句一起使用,以限制給定數量的行並根據指定的條件對其進行篩選。

示例

以下是顯示 CUSTOMERS 表中前兩位姓名以“K”開頭的客戶的詳細資訊的查詢:

SELECT TOP 2 * FROM CUSTOMERS WHERE NAME LIKE 'k%'

輸出

產生以下結果:

ID 姓名 年齡 地址 工資
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00

帶有 DELETE 語句的 TOP 子句

TOP 子句可用於 DELETE 語句以刪除滿足給定條件的特定數量的行。

示例

在以下查詢中,我們使用帶有 TOP 子句的 DELETE 語句。在這裡,我們刪除了前 2 位姓名以“K”開頭的客戶:

DELETE TOP(2) FROM CUSTOMERS WHERE NAME LIKE 'K%';

輸出

我們得到如下所示的輸出:

(2 rows affected)

驗證

我們可以使用 SELECT 語句檢索表的內容來驗證更改是否已反映在表中,如下所示:

SELECT * FROM CUSTOMERS;

表顯示如下:

ID 姓名 年齡 地址 工資
1 Ramesh 32 32 2000.00
4 Delhi 25 15000 6500.00
5 Kaushik 27 23 8500.00
6 Kota 22 20000 4500.00
7 Chaitali 24 28 10000.00

TOP 和 WITH TIES 子句

使用 ORDER BY 子句根據列對錶中的資料進行排序時,有時多個行可能在 ORDER BY 子句中指定的列中包含相同的值。

如果嘗試使用 TOP 子句限制記錄數量,則可能無法過濾所有合格列。

WITH TIES 子句用於確保包含具有相同值(具有“關聯”值的記錄)的記錄在查詢結果中。

示例

考慮上面建立的表CUSTOMERS。如果需要按工資值的升序檢索前 2 位客戶,則查詢如下:

SELECT TOP 2 * FROM CUSTOMERS ORDER BY SALARY;

結果表將是:

ID 姓名 年齡 地址 工資
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00

但是,表中前兩個工資值(按升序排列)是 1500 和 2000,而 CUSTOMERS 表中還有另一列的工資值為 2000,該列未包含在結果中。

如果要檢索所有具有前兩個工資值的列(按升序排列)。我們需要使用WITH TIES子句,如下所示:

SELECT TOP 2 WITH TIES * FROM CUSTOMERS ORDER BY SALARY;

輸出

結果表將是:

ID 姓名 年齡 地址 工資
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00
1 Ramesh 32 32 2000.00

TOP 子句的用途

TOP 子句的一些常見用例包括:

  • 分頁:顯示大量記錄時,TOP 子句可用於一次僅返回一定數量的記錄,從而實現資料的更易於管理和更高效的分頁。

  • 資料取樣:TOP 子句可用於快速檢索表中的資料樣本以進行測試或分析。

  • 提高效能:透過限制返回的行數,TOP 子句可以幫助提高查詢效能,尤其是在處理大型表時。

  • 除錯:在開發或除錯查詢時,TOP 子句可用於快速返回少量行以測試查詢的正確性。

  • 資料視覺化:TOP 子句可用於限制為視覺化目的而返回的行數,例如建立圖表或圖形。

廣告