English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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是用逗号分隔的要获取其值的数据库表的列名或字段名的列表(例如nameagecountry等)。让我们看看它是如何工作的。

假设我们在数据库中有一个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)表中收入最高的前三名雇员

-- 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%的雇员。

-- SQL Server数据库的语法
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 |
+--------+--------------+------------+--------+---------+