7.5 分页查询

在 Spark 中,可以使用窗口函数和子查询实现分页查询。以下是两种常见的分页查询方法:

方法一:使用 row_number() 函数

SELECT * 
FROM (
    SELECT *, row_number() OVER (ORDER BY sal DESC) AS row_num
    FROM emp
) AS ranked_emp
WHERE row_num BETWEEN 3 AND 5;

方法二:嵌套子查询

SELECT *
FROM (
    SELECT *, row_number() OVER (ORDER BY sal DESC) AS row_num
    FROM emp
) AS ranked_emp
WHERE row_num >= 3 
  AND row_num <= 5;

7.6 EXISTS 子句

EXISTS 子句用于检查子查询是否返回结果集。其执行流程如下:

  1. 遍历主查询中的每条记录。
  2. 对于每条记录,执行 EXISTS 子句中的子查询。
  3. 如果子查询返回至少一条记录,则 EXISTS 子句返回 TRUE,并将主查询的当前记录添加到结果集中。
  4. 如果子查询没有返回任何记录,则 EXISTS 子句返回 FALSE,并且不会将主查询的当前记录添加到结果集中。

IN 与 EXISTS 的性能比较

  • 当子查询返回的结果集较小,而主查询的表较大且已建立索引时,使用 IN 子句效率更高。
  • 当主查询的记录数较少,而子查询的表较大且已建立索引时,使用 EXISTS 子句效率更高。

INEXISTS 的主要区别在于驱动顺序:

  • EXISTS 子句以主查询为驱动表,先访问主查询。
  • IN 子句先执行子查询。

因此,选择使用哪种子句取决于驱动表的查询速度,以及索引和结果集大小的影响。

注意:IN 子句不会处理 NULL 值。