pyspark-SQL中limit的用法

368 阅读2分钟

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 SQLSpark SQL标准SQL(如MySQL)
分页查询LIMIT offset, countLIMIT count OFFSET offsetLIMIT offset, count(同 Hive)
复杂类型访问map_col['key']map_col['key'] 或 map_col.key不支持(需自定义函数)
数组展开LATERAL VIEW explode(arr_col) tmpexplode(arr_col) 直接使用需递归CTE或JSON函数模拟
时间函数from_unixtime(unix_timestamp())current_timestamp()NOW()
外部分区表必须显式声明分区字段可自动推断分区字段(如/date=2023/)无原生分区语法
插入数据INSERT INTO TABLE ...INSERT INTO TABLE ... 或 DataFrame APIINSERT INTO ..

不同数据库的差异

数据库语法备注
MySQLLIMIT offset, count直接支持
PostgreSQLLIMIT count OFFSET offset参数顺序相反
SQLiteLIMIT count OFFSET offset同 PostgreSQL
SQL ServerOFFSET 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;