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 子句可用于限制为可视化目的而返回的行数,例如创建图表或图形。

广告