2.19 sql限制查询(LIMIT、分页查询实现)

2.19 限制查询(LIMIT、分页查询实现)

在电商数据分析中,你几乎每天都要用到限制查询:

  • 商品销量TOP 100。

  • 高价值订单TOP 50。

  • 分页查看订单列表(每页20条)。

  • 抽样查看数据(取前100条验证)。

LIMIT子句就是用来限制结果集行数的。这一章我会带你彻底搞懂LIMIT的用法:固定行数限制、带偏移量的分页、与排序配合取TOP N。学完之后,你能高效提取排行榜数据,实现大数据量的分页浏览。

学习前准备:

  • 已完成MySQL安装(参考系列前几章)

  • 已安装DBeaver或Navicat

  • 准备一个练习数据库,比如limit_demo

学习前环境准备

步骤1:确保MySQL服务已启动。

步骤2:创建练习数据库和表,并插入示例数据(数据量要大一点,演示分页效果)。

sql 复制代码
CREATE DATABASE limit_demo
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE limit_demo;

-- 订单表(插入100条模拟数据,用存储过程或循环)
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    product_name VARCHAR(100),
    amount DECIMAL(10,2) NOT NULL,
    create_time DATETIME NOT NULL
);

-- 插入100条测试数据(使用存储过程或直接循环,这里简化手动插入20条示例,实际可用脚本)
INSERT INTO orders (user_id, product_name, amount, create_time) VALUES
(1001, '碎花连衣裙', 299.00, '2025-06-01 10:00:00'),
(1002, '纯棉T恤', 189.00, '2025-06-01 11:00:00'),
(1003, '牛仔裤', 599.00, '2025-06-02 09:30:00'),
(1004, '雪纺衫', 399.00, '2025-06-03 14:20:00'),
(1005, '儿童T恤', 99.00, '2025-06-03 16:00:00'),
(1006, '真丝连衣裙', 1299.00, '2025-06-04 08:30:00'),
(1007, '休闲短裤', 89.00, '2025-06-04 10:00:00'),
(1008, '基础打底衫', 89.00, '2025-06-05 09:00:00'),
(1009, 'Polo衫', 259.00, '2025-06-05 14:00:00'),
(1010, '西装外套', 899.00, '2025-06-06 11:00:00'),
(1011, '运动鞋', 399.00, '2025-06-07 09:30:00'),
(1012, '棒球帽', 59.00, '2025-06-08 15:00:00'),
(1013, '休闲裤', 199.00, '2025-06-09 10:00:00'),
(1014, '毛衣', 329.00, '2025-06-10 11:30:00'),
(1015, '羽绒服', 1299.00, '2025-06-11 08:00:00'),
(1016, '短裙', 159.00, '2025-06-12 09:00:00'),
(1017, '卫衣', 249.00, '2025-06-13 10:00:00'),
(1018, '风衣', 899.00, '2025-06-14 14:00:00'),
(1019, '背心', 39.00, '2025-06-15 16:30:00'),
(1020, '泳衣', 199.00, '2025-06-16 11:00:00');
-- 实际练习时可以继续插入更多行,这里20行足够演示。

LIMIT限制查询基础认知

LIMIT子句用于限制SELECT语句返回的行数 。它通常放在SQL语句的最后(ORDER BY之后)。

基本语法

sql 复制代码
SELECT 列 FROM 表 LIMIT [偏移量,] 行数;
  • 单参数:LIMIT N 返回前N行。

  • 双参数:LIMIT offset, count 从第offset+1行开始,返回count行。

在电商数据分析中的核心用途

  • 排行榜TOP N(ORDER BY ... LIMIT N)。

  • 分页查询(LIMIT offset, pageSize)。

  • 抽样验证(LIMIT 100)。

我的踩坑经历 :第一次写LIMIT时,我用了LIMIT 10, 5,以为是从第10行开始取5行。结果取的是第11-15行(因为偏移量从0开始)。后来才明白,LIMIT offset, count中的offset是从0开始计数的。

固定行数限制

4.1 基础语法

sql 复制代码
SELECT * FROM 表 LIMIT N;

返回前N行(顺序不确定,除非配合ORDER BY)。

4.2 电商实操案例

案例一:查看前5条订单(快速预览)

sql 复制代码
SELECT * FROM orders LIMIT 5;

预期结果:返回order_id从1到5的记录。

案例二:销量最高的前3个商品(配合ORDER BY)

sql 复制代码
SELECT product_name, amount FROM orders
ORDER BY amount DESC
LIMIT 3;

预期结果:1299(真丝连衣裙), 1299(羽绒服), 899(西装外套) --- 实际数据中有两个1299,顺序可能根据其他列。

案例三:最新创建的10条订单

sql 复制代码
SELECT order_id, create_time FROM orders
ORDER BY create_time DESC
LIMIT 10;

预期结果:最新10条订单(id从20向下)。

4.3 分步操作

  1. 先写出不带LIMIT的查询,确认排序正确。

  2. 加上ORDER BY确保顺序。

  3. 在末尾加上LIMIT N

  4. 执行验证。

避坑提醒

  • 没有ORDER BYLIMIT返回的行是不确定的(可能随数据库状态变化)。

  • 排行榜必须先排序再LIMIT

实操避坑提醒 :如果需要取第N名之后的记录(比如第6到第10名),就要用到带偏移量的LIMIT

偏移量+行数的LIMIT语法(分页核心)

5.1 基础语法

sql 复制代码
SELECT * FROM 表 LIMIT offset, count;
  • offset:跳过前offset行(从0开始)。

  • count:返回的行数。

5.2 电商实操案例

案例一:跳过前5行,取第6-10行

sql 复制代码
SELECT * FROM orders ORDER BY order_id LIMIT 5, 5;

预期结果:order_id为6,7,8,9,10的记录。

案例二:销量排序后,取第4-6名(跳过前3名)

sql 复制代码
SELECT product_name, amount FROM orders
ORDER BY amount DESC
LIMIT 3, 3;

预期结果:第4、5、6高的订单。

5.3 分页公式

假设每页显示pageSize条,当前页码pageNum(从1开始),则:

sql 复制代码
LIMIT (pageNum - 1) * pageSize, pageSize

示例 :每页10条,第3页 → LIMIT 20, 10

5.4 分步操作

  1. 确定每页行数和当前页码。

  2. 计算偏移量 = (pageNum - 1) * pageSize。

  3. LIMIT offset, pageSize

  4. 必须配合ORDER BY保证顺序稳定。

避坑提醒

  • 偏移量从0开始,第一页LIMIT 0, pageSize

  • 大数据量分页时,偏移量很大(如LIMIT 100000, 10)性能差,需要优化(用子查询先定位起始行)。

我的踩坑经历 :我曾经做订单分页,直接LIMIT 100000, 10,查询跑了十几秒。后来改用"游标分页"或"记住上一页最后一条ID",性能大幅提升。

标准分页查询的实现逻辑

6.1 前端分页参数

  • pageNum:当前页码(从1开始)。

  • pageSize:每页显示条数。

6.2 后端SQL模板

sql 复制代码
SELECT * FROM orders
ORDER BY order_id  -- 必须稳定排序
LIMIT (pageNum - 1) * pageSize, pageSize;

6.3 电商实操案例:订单列表分页

第1页(每页5条):

sql 复制代码
SELECT * FROM orders ORDER BY order_id LIMIT 0, 5;

第2页

sql 复制代码
SELECT * FROM orders ORDER BY order_id LIMIT 5, 5;

第3页

sql 复制代码
SELECT * FROM orders ORDER BY order_id LIMIT 10, 5;

6.4 获取总行数(用于总页数计算)

sql 复制代码
SELECT COUNT(*) FROM orders;

总页数 = ceil(总行数 / pageSize)。

6.5 分步操作

  1. 先写COUNT(*)查询获取总行数。

  2. 根据当前页码和每页大小计算偏移量。

  3. 执行分页查询。

  4. 前端展示时提供"上一页""下一页"按钮。

避坑提醒

  • 排序字段必须有索引,否则分页查询会慢。

  • 不要用LIMIT跳过大量行,可以用"游标分页"代替。

实操避坑提醒:如果用户频繁翻页到很靠后的页码,建议限制最大页码,或改用"加载更多"模式(基于最后一条ID)。

LIMIT与WHERE、ORDER BY的配合用法

7.1 基础语法

sql 复制代码
SELECT 列 FROM 表
WHERE 条件
ORDER BY 列
LIMIT N;

执行顺序:WHEREORDER BYLIMIT

7.2 电商实操案例

案例一:女装类目中金额最高的3个订单

sql 复制代码
SELECT product_name, amount FROM orders
WHERE product_name LIKE '%连衣裙%' OR product_name LIKE '%雪纺%'
ORDER BY amount DESC
LIMIT 3;

案例二:6月份订单中,金额大于500的订单,按时间降序取前5条

sql 复制代码
SELECT * FROM orders
WHERE create_time BETWEEN '2025-06-01' AND '2025-06-30'
  AND amount > 500
ORDER BY create_time DESC
LIMIT 5;

案例三:用户1001的最新2条订单

sql 复制代码
SELECT * FROM orders
WHERE user_id = 1001
ORDER BY create_time DESC
LIMIT 2;

7.3 分步操作

  1. WHERE条件筛选数据。

  2. ORDER BY排序。

  3. LIMIT限制行数。

  4. 执行验证。

避坑提醒

  • LIMIT必须放在ORDER BY之后,不能颠倒顺序。

  • 如果WHERE条件没有命中索引,加上LIMIT可能还会扫描很多行,需要优化索引。

我的踩坑经历 :我写过SELECT * FROM orders WHERE amount > 500 LIMIT 10,没有排序,结果每次返回的10条都不一样。后来加了ORDER BY order_id才稳定。

综合实操案例:服饰类目店铺商品销量TOP100与订单分页报表

8.1 案例背景

某服饰类目店铺需要完成以下任务:

  1. 提取销量最高的前100个商品(按订单金额降序,因为示例没有销量字段,用金额代替)。

  2. 实现订单数据分页报表:每页20条,支持第1、2、3页。

  3. 在女装类目中,提取销售额(金额)排名前20的商品(按金额降序)。

  4. 用户消费排行分页查询:每页10条,按用户总消费金额排序(需要分组聚合)。

8.2 分步操作

步骤1:销量最高前100商品(按金额降序)

sql 复制代码
SELECT product_name, amount FROM orders
ORDER BY amount DESC
LIMIT 100;

由于数据只有20条,实际返回全部。

步骤2:订单分页报表(第1页,每页5条)

sql 复制代码
SELECT * FROM orders
ORDER BY order_id
LIMIT 0, 5;

第2页

sql 复制代码
SELECT * FROM orders
ORDER BY order_id
LIMIT 5, 5;

第3页

sql 复制代码
SELECT * FROM orders
ORDER BY order_id
LIMIT 10, 5;

步骤3:女装类目销售额TOP 20(按金额降序)

sql 复制代码
SELECT product_name, amount FROM orders
WHERE product_name LIKE '%连衣裙%' OR product_name LIKE '%雪纺%' OR product_name LIKE '%T恤%' OR product_name LIKE '%打底衫%'
ORDER BY amount DESC
LIMIT 20;

步骤4:用户消费排行分页(每页10条,第1页)

首先需要按用户聚合总消费金额。

sql 复制代码
SELECT user_id, SUM(amount) AS total_spent
FROM orders
WHERE order_status = '已支付'  -- 假设有状态,这里忽略
GROUP BY user_id
ORDER BY total_spent DESC
LIMIT 0, 10;

第2页

sql 复制代码
SELECT user_id, SUM(amount) AS total_spent
FROM orders
GROUP BY user_id
ORDER BY total_spent DESC
LIMIT 10, 10;

8.3 结果验证

执行所有查询,检查行数、顺序是否正确。

📌 电商数据合规提示 :在用户消费排行分页中,如果user_id是内部匿名ID,可以输出。如果包含真实用户标识(如手机号),必须脱敏。另外,导出大量数据(如TOP100)需审批。

本章踩坑清单与合规总结

9.1 新手常见踩坑

错误 原因 正确做法
LIMIT不配合ORDER BY 结果顺序不确定 始终加ORDER BY
偏移量从1开始计算 误解语法 偏移量从0开始
分页查询用大偏移量 性能差 用游标分页或记住最后ID
LIMIT放在WHERE前面 语法错误 WHEREORDER BYLIMIT
忘记处理总行数 无法计算总页数 单独COUNT(*)查询

9.2 性能优化建议

  • 对于深度分页(偏移量很大),可以使用"延迟关联"或"记住上一页最后一条ID"的方式。

  • 示例:SELECT * FROM orders WHERE order_id > last_id ORDER BY order_id LIMIT 10

  • 确保ORDER BY字段有索引。

结语

LIMIT是SQL中实现TOP分析和分页查询的核心。掌握固定行数、带偏移量、与排序配合,你就能轻松处理排行榜和大数据量分页。

有问题的评论区留言,我看到会回复。

相关推荐
Shorasul2 小时前
Redis怎样提取门店具体坐标_通过GEOPOS指令读取Geo内部经纬度信息
jvm·数据库·python
m0_377618232 小时前
Redis怎样利用Lua为多个Key同步续期
jvm·数据库·python
2401_832635582 小时前
如何使用宝塔面板配置高性能网站防火墙_启用WAF防御规则
jvm·数据库·python
数厘2 小时前
2.17 sql条件筛选(WHERE、比较运算符、逻辑运算符、BETWEEN、IN、LIKE模糊查询、IS NULL)
数据库·sql
DaqunChen2 小时前
如何查看对象在数据文件中的分布_DBA_EXTENTS与FILE_ID映射关系
jvm·数据库·python
2301_803538952 小时前
golang如何实现备忘录模式_golang备忘录模式实现方案
jvm·数据库·python
qq_206901392 小时前
如何授予DBA权限_GRANT DBA TO赋予超级管理员角色
jvm·数据库·python
2402_854808372 小时前
Golang怎么实现分布式追踪采样_Golang如何设置采样率控制Trace数据的采集比例【技巧】
jvm·数据库·python
粉嘟小飞妹儿2 小时前
php怎么使用Ice RPC通信_php如何实现跨语言微服务远程调用
jvm·数据库·python