题解 | 删除记录(二) 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,分页需用窗口函数。

牛客网题目 文章被收录于专栏

做题心得,记录下来,供自己学习

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务