本教程我们将演示如何使用sql limit
子句来限制select
语句返回的行数。
要检索查询返回的行的一部分,请使用limit
和offset
子句。 以下说明了这些子句的语法:
select
column_list
from
table1
order by column_list
limit row_count offset offset;
在这个语法中,
row_count
确定将返回的行数。offset
子句在开始返回行之前跳过偏移行。 offset
子句是可选的。 如果同时使用limit
和offset
子句,offset
会在limit
约束行数之前先跳过偏移行。在使用limit
子句时,使用order by
子句确保返回的行按指定顺序非常重要。
并非所有数据库系统都支持limit
子句,因此,limit
子句仅在某些数据库系统中可用,例如mysql,postgresql,sqlite,sybase sql anywhere和hsqldb。
我们将使用示例数据库中的employees
表来演示limit
子句用法。
以下语句返回employees
表中按first_name
列排序的所有行。
select
employee_id, first_name, last_name
from
employees
order by first_name;
执行上面查询语句,得到以下结果 -
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 103 | alexander | lee |
| 115 | alexander | su |
| 114 | avg | su |
| 193 | britney | zhao |
| 104 | bruce | wong |
... ...
| 100 | steven | lee |
| 203 | susan | zhou |
| 106 | valli | chen |
| 206 | william | wu |
+-------------+------------+-----------+
40 rows in set
如果要只返回前5
行,请使用limit
子句,如以下语句。
select
employee_id, first_name, last_name
from
employees
order by first_name
limit 5;
执行上面查询语句,得到以下结果 -
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 115 | alexander | su |
| 103 | alexander | lee |
| 114 | avg | su |
| 193 | britney | zhao |
| 104 | bruce | wong |
+-------------+------------+-----------+
5 rows in set
要跳过两行并获取接下来的五行,请使用limit
和offset
子句,如以下语句所示。
select
employee_id, first_name, last_name
from
employees
order by first_name
limit 5 offset 3;
结果如下图所示 -
如果使用的是mysql,则可以使用limit offset
子句的较短形式。
select
employee_id, first_name, last_name
from
employees
order by first_name
limit 3 , 5;
可以使用limit
子句获取具有最高或最低值的前n行。 例如,以下声明获得薪资最高的前五名员工。
select
employee_id, first_name, last_name, salary
from
employees
order by salary desc
limit 5;
执行上面示例代码,得到以下结果 -
首先,order by子句按工资按降序对员工进行排序,然后limit
子句限制从查询返回的五行。
为了获得薪资最低的前五名员工,可以按升序对员工进行排序。
假设必须得到公司薪水第二高的员工。请使用limit offset
子句,如下所示。
select
employee_id, first_name, last_name, salary
from
employees
order by salary desc
limit 1 offset 1;
order by
子句按工资降序对员工进行排序。 limit 1 offset 1
子句从结果集中获取第二行。
此查询的假设是每个员工都有不同的薪水。 如果有两名员工拥有相同的最高薪水,那么它将会失败。 此外,如果有两个或更多具有相同第二高薪的员工,则查询只返回第一个。
要解决此问题,可以使用以下语句首先获得第二高薪。
select distinct
salary
from
employees
order by salary desc
limit 1 , 1;
执行上面示例代码,得到以下结果 -
mysql> select distinct
salary
from
employees
order by salary desc
limit 1 , 1;
+--------+
| salary |
+--------+
| 17000 |
+--------+
1 row in set
并将结果传递给另一个查询:
select
employee_id, first_name, last_name, salary
from
employees
where
salary = 17000;
结果如下所示 -
如果使用子查询,则可以将两个查询组合到单个查询中,如下所示:
select
employee_id, first_name, last_name, salary
from
employees
where
salary = (select distinct
salary
from
employees
order by salary desc
limit 1 , 1);
结果如下所示 -
在本教程中,我们向您介绍了sql limit
和offset
子句,这些子句用于限制查询返回的行数。