在本教程中,您将学习如何从表中检索指定的记录数。
在某些情况下,您可能不需要返回查询的所有行,例如,如果您只想检索最近加入该组织的前10名员工,或者按分数获得前3名学生,等等。
要处理这种情况,在SELECT语句中使用SQL可以使用TOP的子句。但是,该TOP子句仅被SQL Server和MS Access数据库系统支持。
MySQL提供了一个等效的LIMIT子句,而Oracle为SELECT语句提供ROWNUM子句,以限制查询返回的行数。
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)表中收入最高的前三名雇员。
-- 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子句与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子句接受可选的第二个参数。
当指定了两个参数时,第一个参数指定要返回的第一行的偏移量,即起点,而第二个参数指定要返回的最大行数。初始行的偏移量是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 | +--------+--------------+------------+--------+---------+