SQL TOP
/ MySQL LIMIT
子句
在本教程中,您将学习如何从表中检索固定数量的记录。
限制结果集
在某些情况下,您可能对查询返回的所有行都不感兴趣,例如,如果您只想检索最近加入组织的前 10 名员工,按分数获得前 3 名学生,或类似的东西。
要处理这种情况,可以在 SELECT
语句中使用 SQL 的 TOP
子句。 但是,TOP
子句仅受 SQL Server 和 MS Access 数据库系统支持。
MySQL 提供了一个等效的 LIMIT
子句,而 Oracle 为 SELECT
语句提供了 ROWNUM
子句来限制查询返回的行数。
SQL TOP 语法
SQL TOP
子句用于限制返回的行数。 它的基本语法是:
number
| percent
column_list
FROM table_name
;在这里,column_list 是一个逗号分隔的数据库表(例如 name, age, country 等)的列或字段名称列表,您要获取其值。 让我们看看它是如何工作的。
假设我们的数据库中有一个 employees 表,其中包含以下记录:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | +--------+--------------+------------+--------+---------+
以下语句返回 employees 表中薪酬最高的前三名员工。
-- SQL Server 数据库的语法
SELECT TOP 3 * FROM employees
ORDER BY salary DESC;
返回的结果集如下所示:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | +--------+--------------+------------+--------+---------+
如果您只想检索行的百分比而不是固定的行数,则可以选择在 TOP
子句中的固定值之后使用 PERCENT
关键字。 小数值四舍五入到下一个整数值(例如,1.5 四舍五入为 2)。
以下语句返回收入最高的 30% 员工。
-- Syntax for SQL Server Database
SELECT TOP 30 PERCENT * FROM employees
ORDER BY salary DESC;
上述查询返回的结果集如下所示:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+
MySQL LIMIT 语法
MySQL 的 LIMIT
子句与 SQL TOP
子句的作用相同。 它的基本语法是:
column_list
FROM table_name
LIMIT number;以下语句返回 employees 表中薪酬最高的前三名员工。
-- MySQL 数据库的语法
SELECT * FROM employees
ORDER BY salary DESC LIMIT 3;
执行后,你会得到如下输出:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | +--------+--------------+------------+--------+---------+
注意: 在 SELECT
语句中,始终将 ORDER BY
子句与 LIMIT
子句一起使用。 否则,您可能无法获得想要的结果。
在 LIMIT 子句中设置行偏移
LIMIT
子句接受可选的第二个参数。
当指定两个参数时,第一个参数指定要返回的第一行的偏移量,即起始点,而第二个参数指定要返回的最大行数。 初始行的偏移量是0
(不是1
)。
因此,如果您想找出薪酬第三高的员工,您可以执行以下操作:
-- MySQL 数据库的语法
SELECT * FROM employees
ORDER BY salary DESC LIMIT 2, 1;
执行上述命令后,您将在结果集中仅获得一条记录:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | +--------+--------------+------------+--------+---------+