跳至主要内容

如何高效使用 SQL LIMIT 子句

了解 SQL LIMIT 子句在数据筛选中的应用。掌握在 PostgreSQL 和 MySQL 数据库中使用 LIMIT 子句的方法。
· 8分钟 阅读

使用 AI 探索

SQL 的 LIMIT 子句用于控制查询返回的记录数量。顾名思义,LIMIT 子句会在数据筛选后限制显示的行数。该子句在处理大型数据集时尤为重要,因为您可能只想获取特定的数据片段。

如果您正立志成为数据从业者,我强烈推荐学习 DataCamp 的 Introduction to SQL 和 SQL Fundamentals 课程,以获取适用于数据分析的 SQL 技能。

简要回答:什么是 SQL LIMIT 子句?

SQL 的 LIMIT 子句用于指定在数据筛选后查询应返回的记录数。这种做法允许仅返回部分数据用于展示或分析。因此,在数据分页中,LIMIT 子句对于将大数据分块为较小片段非常重要。它也用于性能优化,以避免可能拖慢数据库性能的大查询。

下面的示例展示了 LIMIT 子句的基本用法,只显示 employees 表中的前 10 行记录。

-- Select all columns from the employees table
-- and limit the number of returned rows to 10.
SELECT * 
FROM employees
LIMIT 10;

SQL LIMIT 子句的语法

SQL 的 LIMIT 子句包含在 SELECT 语句中,用于控制查询返回的记录数量。LIMIT 子句添加在语句末尾,以按指定条件过滤记录。您也可以查看 DataCamp 的 SQL 基础速查表,了解更多关于 LIMIT 及其他常见 SQL 子句的内容。

-- Select columns column1, column2, ... from the table table_name
SELECT column1, column2, ...
FROM table_name
-- Limit the number of rows returned to number_of_rows
LIMIT number_of_rows;

下面是一个 LIMIT 子句的实际示例。该查询仅显示 employees 表中 first_name、last_name 和 department 三列的 10 条记录。

-- Select first_name, last_name, and department from the employees table
SELECT first_name, last_name, department
FROM employees
-- Limit the number of rows returned to 10
LIMIT 10;

有时,您可以使用可选的 OFFSET 子句,在显示目标行之前跳过指定数量的行。OFFSET 的语法如下所示。

-- Select column_names from the table table_name
SELECT column_names
FROM table_name
-- Arrange the results in ascending order based on column_name
ORDER BY column_name
-- Limit the number of rows returned to number_of_rows, starting from offset_value
LIMIT number_of_rows OFFSET offset_value;

在上述 SQL 查询中,number_of_rows 表示要返回的行数,而 offset_value 表示在返回结果前需要跳过的行数。

下面的示例展示了如何使用 SQL 的 OFFSET 和 LIMIT 子句来控制返回的行数。虽然 LIMIT 子句指定返回 10 行记录,但查询中的 OFFSET 子句会跳过前 5 行。因此,结果将显示从第 6 行到第 15 行(共 10 行)。

-- Select first_name, last_name, and department from the employees table
SELECT first_name, last_name, department
FROM employees
-- Limit the number of rows returned to 10, starting from the 6th row (offset of 5)
LIMIT 10 OFFSET 5;

关于 SQL LIMIT 子句需要记住的重要要点

正确理解如何在不同 SQL 数据库中实现 LIMIT 子句及其变体,对于优化查询性能并确保准确的数据检索至关重要。下面我们来看一些要点。

LIMIT 子句在 SELECT 语句中的位置

LIMIT 子句通常位于 SELECT 语句的末尾、FROM 子句之后。如果您还使用了其他可选的聚合子句,如 WHERE、GROUP BY 和 ORDER BY,请确保 LIMIT 子句位于整个查询的最后。

-- Select all columns from the employees table
SELECT *
FROM employees
-- Limit the number of rows returned to 5, starting from the 21st row (offset of 20)
LIMIT 10 OFFSET 20;

将 LIMIT 与 ORDER BY 子句结合使用

LIMIT 子句可以与 ORDER BY 聚合一起使用,以获得一致且可预测的结果。此方式可确保在检索数据前按特定顺序对数据进行排序。如下例所示,我们在展示筛选后的行之前,按 hire_date 以降序对数据进行排序。

-- Select all columns from the employees table
SELECT *
FROM employees
-- Arrange the results in descending order based on hire_date
ORDER BY hire_date DESC
-- Limit the number of rows returned to 10
LIMIT 10;

我建议学习 DataCamp 的 Associate Data Analyst in SQL 职业路径和 Reporting in SQL 课程,以进一步了解聚合函数及其在数据分析中的应用。

不同数据库中的 SQL LIMIT 变体与语法

以上示例展示了在 PostgreSQL、SQLite 和 MySQL 等支持的数据库中使用 SQL LIMIT 子句。

在 SQL Server 中要实现类似效果,可使用 TOP 来控制返回的记录数。

-- Select the top 10 records of first_name, last_name from the employees table
SELECT TOP 10 first_name, last_name
FROM employees
-- Arrange the results in descending order based on hire_date
ORDER BY hire_date DESC;

类似地,Oracle 数据库支持使用 FETCH FIRST n ROWS ONLY 来控制查询返回的记录数。

-- Select the first_name and last_name columns from the employees table
SELECT first_name, last_name
FROM employees
-- Order the results in descending order based on hire_date
ORDER BY hire_date DESC
-- Limit the number of rows returned to the first 10 rows
FETCH FIRST 10 ROWS ONLY;

分页中的 LIMIT 与 OFFSET

SQL 的 LIMIT 和 OFFSET 通常结合使用,以实现高效的数据分页。此方法可将大型数据集拆分为更小、可管理的块,以便适当展示。

在下面的示例中,LIMIT 和 OFFSET 子句将显示的行数限制为 10,但从第 21 行开始。

-- Select all columns from the employees table
SELECT *
-- Arrange the results in descending order based on hire_date
FROM employees
ORDER BY hire_date DESC
-- Limit the number of rows returned to 10, starting from the 21st row (offset of 20)
LIMIT 10 OFFSET 20;

SQL LIMIT 子句的常见用例

  • 分页:与 OFFSET 子句结合时,LIMIT 子句常用于 Web 应用中的数据分页。该方法将数据以更小的块/子集展示,例如分页显示。
  • 优化性能:LIMIT 子句可通过降低数据库服务器负载来提升查询性能。其方式是在同一时间仅获取并返回较小的数据子集。
  • 数据抽样:在数据分析中,LIMIT 子句可用于获取较小的数据子集,有助于分析人员在分析过程中提升性能。

SQL LIMIT 命令的局限性

SQL LIMIT 子句的局限性包括以下几点:

  • 并非所有数据库都支持:LIMIT 子句并非在所有数据库中都受支持。例如,SQL Server 和 Oracle 数据库不支持 LIMIT 子句。
  • 较大 OFFSET 值带来的性能问题:使用较大的 OFFSET 值可能导致数据库服务器变慢,从而使查询执行速度下降。

为避免不同数据库带来的限制,可考虑使用以下替代方案。

SQL Server 中的 TOP 子句

在 SQL Server 数据库中,TOP 子句可实现与 LIMIT 子句相同的效果。

-- Select the top 10 rows from the employees table ordered by hire_date
SELECT TOP 10 first_name, last_name
FROM employees
ORDER BY hire_date DESC;

SQL Server 与 DB2 中的 FETCH FIRST n ROWS ONLY

FETCH FIRST n ROWS ONLY 也能在 SQL Server 和 DB2 数据库中返回与 LIMIT 子句类似的结果。

-- Select the first 10 rows from the employees table ordered by hire_date
SELECT first_name, last_name
FROM employees
ORDER BY hire_date DESC
FETCH FIRST 10 ROWS ONLY;

Oracle 中的 ROWNUM

在 Oracle 数据库中,ROWNUM 函数用于控制从数据中返回的记录数。该函数通常结合子查询来按需过滤数据。

-- Select the top 10 rows from the employees table ordered by hire_date
SELECT * FROM (
    SELECT first_name, last_name
    FROM employees
    ORDER BY hire_date DESC
) WHERE ROWNUM <= 10;

结论

SQL 的 LIMIT 子句对于在从数据库检索数据后限制显示的行数非常重要。作为数据从业者,理解 LIMIT 子句在数据分析与处理中的不同用法至关重要。同样,您应考虑数据库对 LIMIT 子句的支持情况,在使用如 SQL Server 和 Oracle 等不兼容数据库时,选择其他替代函数。

要理解 SQL LIMIT 子句的不同应用场景,您应持续在不同数据集上进行练习。DataCamp 的 Learn SQL 和 Intermediate SQL 课程能够帮助您获得更高级的 SQL 技能。我也建议您参加 DataCamp 的 SQL Associate Certification,以展示您在 SQL 方面的掌握,并在数据从业者中脱颖而出。

Allan Ouko

作者

Allan Ouko

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。

常见问题

SQL LIMIT 函数有什么用?

SQL 的 LIMIT 函数用于控制从已筛选数据中返回的行数。

SQL LIMIT 的主要用途是什么?

SQL LIMIT 主要用于网页上的数据分页,以限制显示的行数。

所有数据库都支持 SQL LIMIT 子句吗?

SQL 的 LIMIT 函数仅在 PostgreSQL、MySQL 和 SQLite 数据库中受支持。该子句在 SQL Server 和 Oracle 数据库中不受支持。

在不支持的数据库中,LIMIT 子句的替代方案是什么?

在不支持 SQL LIMIT 的数据库中,SQL Server 的替代方案是 TOP 和 FETCH FIRST n ROWS ONLY 子句。Oracle 数据库则使用 ROWNUM 函数来替代 LIMIT。

在 SQL LIMIT 子句中,OFFSET 有什么用?

我们可以使用 OFFSET 来指定在通过 LIMIT 子句返回特定数量的行之前要跳过的行数。

主题