题解 | 删除记录(二) limit
删除记录(二)
https://www.nowcoder.com/practice/964c9f7fffbb4ab18b507cfed4111b4a
delete from exam_record where timestampdiff(minute, start_time, submit_time) < 5 or submit_time is null order by start_time limit 3;
LIMIT是SQL中用于限制查询结果返回行数的核心语法
LIMIT的核心用法(MySQL专属,最基础)
LIMIT是MySQL的语法(PostgreSQL也支持),作用是只返回查询结果的前N行,或指定起始位置返回多行,语法有两种:
1. 基础写法:LIMIT N(返回前N行)
-- 示例:查询exam_record表,只返回前5条记录 SELECT uid, exam_id, score FROM exam_record WHERE score > 60 LIMIT 5;
2. 进阶写法:LIMIT offset, N(指定起始位置,返回N行)
-- 示例:从第3行开始(offset从0计数),返回10条记录(分页第2页,每页10条) SELECT uid, exam_id, score FROM exam_record WHERE score > 60 LIMIT 2, 10;
3. 简化分页写法:LIMIT N OFFSET offset(和上面等价,更易读)
-- 和LIMIT 2,10完全等价,推荐这种(语义更清晰) SELECT uid, exam_id, score FROM exam_record WHERE score > 60 LIMIT 10 OFFSET 2;
LIMIT的高频实战技巧
1. 结合ORDER BY使用(最实用)
LIMIT本身不保证结果顺序,必须搭配ORDER BY才能精准获取“前N条符合条件的记录”:
-- 示例:获取exam_record表中分数最高的前3条记录 SELECT uid, exam_id, score FROM exam_record WHERE submit_time IS NOT NULL ORDER BY score DESC -- 按分数降序 LIMIT 3;
2. 搭配DELETE/UPDATE(限制操作行数,避免误操作)
数仓中批量删除/更新数据时,用LIMIT限制行数,防止一次性操作过多数据导致性能问题:
-- 示例:只删除exam_record表中分数<60且答题时长<5分钟的前100条记录 DELETE FROM exam_record WHERE TIMESTAMPDIFF(minute, start_time, submit_time) < 5 AND score < 60 LIMIT 100;
3. 注意:LIMIT不支持别名/子查询直接引用(避坑)
-- ❌ 错误:LIMIT中不能用变量/别名 SELECT uid, exam_id FROM exam_record LIMIT @page_size; -- ✅ 正确:先定义变量,再使用(MySQL中) SET @page_size = 5; SELECT uid, exam_id FROM exam_record LIMIT @page_size;
跨数据库的“限制行数”语法(数仓开发必记)
你做数仓开发会接触MySQL/Oracle/Hive/MaxCompute,这些数据库没有统一的LIMIT语法,整理对比表:
关键差异补充:
- Oracle无
LIMIT,需用ROWNUM(注意:ROWNUM只能用<=,不能用>,分页需嵌套子查询): - Hive/MaxCompute仅支持
LIMIT N(基础写法),不支持LIMIT offset,N,分页需用ROW_NUMBER()窗口函数:
总结
LIMIT是MySQL/PostgreSQL的核心语法,用于限制返回行数,基础写法LIMIT N,
分页写法LIMIT offset,N/LIMIT N OFFSET offset;
- 使用
LIMIT务必搭配ORDER BY,否则结果顺序不可控; - 跨数据库注意差异:Oracle用
ROWNUM,Hive/MaxCompute仅支持基础LIMIT N,分页需用窗口函数。
牛客网题目 文章被收录于专栏
做题心得,记录下来,供自己学习
查看3道真题和解析