SQL TOP / MySQL LIMIT 子句

在本教程中,你将学习如何从表中检索固定数量的记录。

限制结果集

在某些情况下,你可能对查询返回的所有行不感兴趣,例如,如果你只想检索最近加入组织的前 10 名员工,按分数获得前 3 名学生,或者类似的东西。

要处理这种情况,可以在 SELECT 语句中使用 SQL 的 TOP 子句。但是,TOP 子句仅受 SQL Server 和 MS Access 数据库系统的支持。

MySQL 提供了一个等效 LIMIT 子句,而 Oracle 为 SELECT 语句提供了限制查询返回的行数的 ROWNUM 子句。

SQL TOP 语法

SQL TOP 子句用于限制返回的行数。它的基本语法是:

SELECT TOP number | percent column_list FROM table_name ; 

这里,column_list 是一个逗号分隔的列表,列出了要获取其值的数据库表(例如,*名称*, *年龄*, *国家*等) 的列或字段名称。让我们看看它是如何工作的。

假设我们的数据库中有一个 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 表中返回前三名收入最高的 *employees*。

-- Syntax for SQL Server Database  
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 子句的工作方式相同。它的基本语法是:

SELECT column_list FROM table_name LIMIT number ; 

以下语句从 employees 表中返回前三名收入最高的 *employees*。

-- Syntax for MySQL Database 
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)。

因此,如果你想找出薪酬第三高的员工,你可以执行以下操作:

-- Syntax for MySQL Database 
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 |
+--------+--------------+------------+--------+---------+