SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

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 是一个逗号分隔的数据库表(例如 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 子句的作用相同。 它的基本语法是:

SELECT 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 |
+--------+--------------+------------+--------+---------+
Advertisements