SQL - TOP 子句


SQL TOP 子句

当我们从 SQL 表中检索数据时,SQL TOP 子句用于限制 SQL Server 中 SELECT 查询返回的行数。另外,我们还可以将其与UPDATE和DELETE语句一起使用,以限制(restrict)结果记录。

例如,如果数据库表中存储了大量数据,并且只想对前 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 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

现在,我们使用 TOP 子句从 CUSTOMERS 表中获取前 4 条记录,而不指定任何条件子句,例如 WHERE、ORDER BY 等。 -

SELECT TOP 4 * FROM CUSTOMERS;

输出

这将产生以下结果 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00

带有 ORDER BY 子句的 TOP

SQL 中的 ORDER BY 子句用于按升序或降序对查询结果集进行排序。我们可以将它与 TOP 子句一起使用来按排序顺序检索(或、更新或、删除等)前N 条记录。

例子

使用以下查询,我们按排序顺序检索CUSTOMERS表的前4 条记录。在这里,我们根据SALARY列按降序对表进行排序-

SELECT TOP 4 * FROM CUSTOMERS ORDER BY SALARY DESC;

输出

我们得到的结果如下 -

ID 姓名 年龄 地址 薪水
7 莫菲 24 印多尔 10000.00
5 哈迪克 27 博帕尔 8500.00
4 柴塔利 25 孟买 6500.00
6 科马尔 22 海得拉巴 4500.00

注意 -默认情况下,ORDER BY 子句按升序对数据进行排序。所以,如果我们需要对数据进行降序排序,就必须使用DESC关键字。

带有 PERCENT 的 TOP 子句

我们还可以通过使用 PERCENT 子句和 TOP 子句指定百分比值而不是数字来限制记录。

例子

以下查询从 CUSTOMERS 表中选择前 40% 的记录,并按 SALARY 升序排序 -

SELECT TOP 40 PERCENT * FROM CUSTOMERS ORDER BY SALARY

输出

我们的表中共有 7 条记录。所以 7 的 40% 是 2.8。因此,SQL Server 将结果舍入为三行(下一个整数),如下面的输出所示 -

ID 姓名 年龄 地址 薪水
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
1 拉梅什 32 艾哈迈达巴德 2000.00

带有 WHERE 子句的 TOP

我们可以使用 TOP 子句和 WHERE 子句来限制给定的行数并根据指定的条件过滤它们。

例子

以下查询显示CUSTOMERS 表中名称以K开头的前两个客户的详细信息 -

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

输出

产生以下结果 -

ID 姓名 年龄 地址 薪水
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00

带有 DELETE 语句的 TOP 子句

TOP 子句可与 DELETE 语句一起使用,以删除满足给定条件的特定数量的行。

例子

在以下查询中,我们使用带有 TOP 子句的 DELETE 语句。在这里,我们删除名称以K开头的前 2 位客户-

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

输出

我们得到的输出如下所示 -

(2 rows affected)

确认

我们可以通过使用 SELECT 语句检索表的内容来验证更改是否反映在表中,如下所示 -

SELECT * FROM CUSTOMERS;

该表显示如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

TOP 和WITH TIES 条款

在使用基于列的 ORDER BY 子句对表中的数据进行排序时,有时多行可能在 ORDER BY 子句中指定的列中包含相同的值。

如果您尝试使用 TOP 子句限制记录数,则可能无法过滤所有符合条件的列。

WITH TIES子句用于确保具有相同值的记录(具有“并列”值的记录)包含在查询结果中。

例子

考虑上面创建的表CUSTOMERS。如果我们需要检索按 SALARY 值升序排序的前 2 位客户,则查询将是 -

SELECT TOP 2 * FROM CUSTOMERS ORDER BY SALARY;

结果表将是 -

ID 姓名 年龄 地址 薪水
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00

但是,表中的前两个工资值(按升序排列)是 1500 和 2000,并且 CUSTOMERS 表中还有另一列工资值为 2000,该列不包含在结果中。

如果您想检索前两个工资值的所有列(按升序排列时)。我们需要使用WITH TIES子句,如下所示 -

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

输出

结果表将是 -

ID 姓名 年龄 地址 薪水
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
1 拉梅什 32 艾哈迈达巴德 2000.00

TOP 子句的用途

TOP 子句的一些常见用例包括 -

  • 分页-显示大量记录时,TOP 子句可用于一次仅返回一定数量的记录,从而实现更易于管理和更高效的数据分页。

  • 采样数据- TOP 子句可用于快速从表中检索数据样本以进行测试或分析。

  • 提高性能-通过限制返回的行数,TOP 子句可以帮助提高查询的性能,特别是在处理大型表时。

  • 调试 -开发或调试查询时,可以使用 TOP 子句快速返回少量行以测试查询的正确性。

  • 数据可视化- TOP 子句可用于限制出于可视化目的返回的行数,例如创建图表或图形。