SQL中limit的用法
SQL中limit的用法
- limit子句用于限制查询结果返回的数量,常用于分页查询
格式:
select * from tableName limit i,n
//tableName:表名
//i:为查询结果的索引值(默认从0开始),当i=0时可省略i
//n:为查询结果返回的数量
//i与n之间使用英文逗号","隔开
//limit n 等同于 limit 0,n
栗子:
//查询10条数据,索引从0到9,第1条记录到第10条记录
select * from t_user limit 10;
select * from t_user limit 0,10;
//查询8条数据,索引从5到12,第6条记录到第13条记录
select * from t_user limit 5,8;
笔记 · 归档
一、语法差异对比表
| 功能场景 | Hive SQL | Spark SQL | 标准SQL(如MySQL) |
|---|---|---|---|
| 分页查询 | LIMIT offset, count | LIMIT count OFFSET offset | LIMIT offset, count(同 Hive) |
| 复杂类型访问 | map_col['key'] | map_col['key'] 或 map_col.key | 不支持(需自定义函数) |
| 数组展开 | LATERAL VIEW explode(arr_col) tmp | explode(arr_col) 直接使用 | 需递归CTE或JSON函数模拟 |
| 时间函数 | from_unixtime(unix_timestamp()) | current_timestamp() | NOW() |
| 外部分区表 | 必须显式声明分区字段 | 可自动推断分区字段(如/date=2023/) | 无原生分区语法 |
| 插入数据 | INSERT INTO TABLE ... | INSERT INTO TABLE ... 或 DataFrame API | INSERT INTO .. |
不同数据库的差异
| 数据库 | 语法 | 备注 |
|---|---|---|
| MySQL | LIMIT offset, count | 直接支持 |
| PostgreSQL | LIMIT count OFFSET offset | 参数顺序相反 |
| SQLite | LIMIT count OFFSET offset | 同 PostgreSQL |
| SQL Server | OFFSET offset ROWS FETCH NEXT count ROWS ONLY | 需配合ORDER BY |
SELECT * FROM table_name LIMIT 9999, 19999;
- 第一个参数 9999:偏移量(offset),表示跳过前 9999 条记录。
- 第二个参数 19999:限制数量(count),表示从偏移后的位置开始,返回 19999 条记录。
等价语义: 跳过前 9999 条,返回第 10000 条到第 29998 条(共 19999 条)的记录。
优化方案
(1) 基于游标的分页(推荐)
使用 有序唯一键(如自增主键) 替代 LIMIT offset, count:
-- 第一页
SELECT * FROM table ORDER BY id ASC LIMIT 19999;
-- 后续页(记录上一页最后一条的 id=10000)
SELECT * FROM table
WHERE id > 10000
ORDER BY id ASC
LIMIT 19999;
优势: 时间复杂度降至 O(count),无需扫描前 offset 条记录。
(2) 分区查询
若表按时间或类别分区,直接查询特定分区:
-- 按日期分区查询
SELECT * FROM sales
WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31'
LIMIT 19999;