ZetCode

SQL LIMIT 语句

最后修改于 2025 年 2 月 25 日

SQL LIMIT 语句用于限制查询返回的行数。当处理大型数据集并且只需要结果的子集时,它特别有用。本教程将通过实际示例介绍如何使用 LIMIT 语句。

LIMIT 子句通常与 ORDER BY 子句结合使用,以根据特定列检索最高或最低的记录。

设置数据库

首先,让我们创建 books 表并插入示例数据。

create_table.sql
-- Create the books table
CREATE TABLE books (
    book_id INTEGER PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    author VARCHAR(100) NOT NULL,
    genre VARCHAR(50) NOT NULL,
    price NUMERIC(5,2) NOT NULL CHECK (price >= 0),
    publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025)
);

-- Insert 30 sample book entries
INSERT INTO books (book_id, title, author, genre, price, publication_year) VALUES
(101, 'The Silent Forest', 'Jane Doe', 'Mystery', 12.99, 2020),
(102, 'Code of Tomorrow', 'John Smith', 'Sci-Fi', 15.50, 2022),
(103, 'Cooking Basics', 'Maria Lopez', 'Non-Fiction', 9.99, 2019),
(104, 'Whispers in the Dark', 'Emily Carter', 'Horror', 13.75, 2021),
(105, 'The Last Empire', 'Robert King', 'Fantasy', 18.99, 2018),
(106, 'Data Driven', 'Alex Chen', 'Non-Fiction', 22.00, 2023),
(107, 'Echoes of Time', 'Sarah Miles', 'Sci-Fi', 14.25, 2020),
(108, 'The Red Shadow', 'Tom Harris', 'Thriller', 11.50, 2017),
(109, 'Garden of Dreams', 'Lily Evans', 'Romance', 8.99, 2022),
(110, 'Quantum Leap', 'David Patel', 'Sci-Fi', 16.80, 2024),
(111, 'Broken Chains', 'Anna Reed', 'Historical', 17.45, 2015),
(112, 'The Hungry Flame', 'Mark Stone', 'Fantasy', 19.99, 2021),
(113, 'Simple Joys', 'Clara White', 'Self-Help', 10.25, 2019),
(114, 'Nightmare City', 'Greg Holt', 'Horror', 12.60, 2023),
(115, 'Love in Bloom', 'Sophie Bell', 'Romance', 7.99, 2020),
(116, 'The Codebreaker', 'James Fox', 'Thriller', 14.99, 2018),
(117, 'Stars Unseen', 'Rachel Kim', 'Sci-Fi', 15.75, 2022),
(118, 'The Lost Recipe', 'Elena Ortiz', 'Non-Fiction', 11.20, 2016),
(119, 'Winds of Fate', 'Henry Blake', 'Fantasy', 20.50, 2023),
(120, 'Silent Witness', 'Laura Dean', 'Mystery', 13.30, 2019),
(121, 'Beyond the Veil', 'Chris Ward', 'Horror', 14.00, 2021),
(122, 'The Art of Calm', 'Nina Patel', 'Self-Help', 9.50, 2020),
(123, 'Empire of Dust', 'Oliver Grant', 'Historical', 18.25, 2014),
(124, 'Twist of Trust', 'Kate Lynn', 'Thriller', 12.85, 2022),
(125, 'Heartstrings', 'Emma Rose', 'Romance', 8.75, 2023),
(126, 'The Infinite Loop', 'Sam Carter', 'Sci-Fi', 16.99, 2024),
(127, 'Bread & Soul', 'Luis Gomez', 'Non-Fiction', 10.85, 2018),
(128, 'Dragon's Breath', 'Tara Hill', 'Fantasy', 21.00, 2020),
(129, 'The Locked Door', 'Peter Shaw', 'Mystery', 11.95, 2021),
(130, 'Mind Over Matter', 'Vikram Singh', 'Self-Help', 13.50, 2022);

books 表使用 book_idtitleauthorgenrepricepublication_year 列创建。PRIMARY KEYNOT NULLCHECK 等约束确保数据完整性。

LIMIT 的基本用法

此示例演示了如何从 books 表中检索前 5 本书。

basic_limit.sql
SELECT * FROM books
LIMIT 5;

LIMIT 5 子句将查询限制为仅从表中返回前 5 行。

LIMIT 与 ORDER BY

此示例检索 5 本最昂贵的书

limit_with_order.sql
SELECT * FROM books
ORDER BY price DESC
LIMIT 5;

ORDER BY price DESC 子句按价格降序对书籍进行排序,LIMIT 5 返回前 5 条结果。

LIMIT 与 OFFSET

此示例检索前 5 本书之后的下一批 5 本书

limit_with_offset.sql
SELECT * FROM books
LIMIT 5 OFFSET 5;

OFFSET 5 子句跳过前 5 行,LIMIT 5 返回接下来的 5 行。

LIMIT 与 WHERE

此示例检索“科幻”类别的前 3 本书

limit_with_where.sql
SELECT * FROM books
WHERE genre = 'Sci-Fi'
LIMIT 3;

WHERE 子句按类别过滤结果,LIMIT 3 返回前 3 条匹配的行。

LIMIT 与聚合

此示例检索拥有最多书籍的前 3 个类别

limit_with_aggregation.sql
SELECT genre, COUNT(*) AS book_count
FROM books
GROUP BY genre
ORDER BY book_count DESC
LIMIT 3;

GROUP BY 子句按类别对结果进行分组,LIMIT 3 返回拥有最多书籍的前 3 个类别。

LIMIT 与 JOIN

此示例检索前 5 本书及其作者

limit_with_join.sql
SELECT books.title, books.author
FROM books
JOIN authors ON books.author_id = authors.id
LIMIT 5;

JOIN 子句将 booksauthors 表中的数据合并,LIMIT 5 返回前 5 行。

LIMIT 与子查询

此示例检索 3 本最昂贵的书

limit_with_subquery.sql
SELECT * FROM (
    SELECT * FROM books
    ORDER BY price DESC
) AS top_books
LIMIT 3;

子查询按价格降序对书籍进行排序,外部查询使用 LIMIT 3 返回前 3 条结果。

LIMIT 与 DISTINCT

此示例检索前 5 位不同的作者

limit_with_distinct.sql
SELECT DISTINCT author
FROM books
LIMIT 5;

DISTINCT 子句确保仅返回唯一的作者,LIMIT 5 将结果限制为前 5 位唯一的作者。

LIMIT 与 UNION

此示例从两个不同的表中检索前 5 本书

limit_with_union.sql
SELECT title, author FROM books
UNION
SELECT title, author FROM old_books
LIMIT 5;

UNION 子句合并来自两个表的查询结果,LIMIT 5 从合并后的结果中返回前 5 行。

LIMIT 与窗口函数

此示例按价格检索每个类别的前 3 本书

limit_with_window.sql
SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY genre ORDER BY price DESC) AS rank
    FROM books
) AS ranked_books
WHERE rank <= 3;

ROW_NUMBER() 窗口函数按价格为每个类别中的书籍排名,外部查询进行过滤以仅返回每个类别的前 3 本书。

使用 LIMIT 的最佳实践

来源

PostgreSQL 文档

在本文中,我们通过实际示例和最佳实践,探讨了如何使用 SQL LIMIT 语句来限制查询结果。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。