更新时间:2026-07-03 GMT+08:00
分享

WHERE

功能描述

WHERE子句用于指定过滤条件,仅返回满足条件的行。Spark 4.0增强了WHERE中的子查询能力,支持LATERAL子查询和相关子查询。

语法格式

SELECT [ ALL | DISTINCT ] projectItem [, ...] FROM table_reference [, ...]
   WHERE boolean_expression 

其中 boolean_expression 可以包含子查询:

{ expression operator ( subquery )
   | [ NOT ] EXISTS ( subquery )
   | expression [ NOT ] IN ( subquery | value [, ...] ) }

参数说明

参数

说明

ALL

返回所有行,包括重复行。为默认选项。

DISTINCT

从结果集中移除重复的行。

boolean_expression

过滤条件表达式,结果为布尔值。

operator

比较运算符,包括 =, !=, <, >, <=, >= 等。

IN / NOT IN

判断值是否在子查询结果或值列表中。当使用子查询时,子查询必须返回单列。

EXISTS / NOT EXISTS

判断子查询是否返回行。EXISTS为真当子查询至少返回一行。子查询中可以引用外部查询的列(相关子查询)。

注意事项

  • 所要查询的表必须是已经存在的表,否则会出错。
  • 使用IN或NOT IN时,子查询的返回结果必须是单列。
  • 使用EXISTS或NOT EXISTS时,子查询可以引用外部查询的列形成相关子查询。

示例

基本条件过滤:

SELECT name, score FROM student WHERE score > 90; 

子查询作为过滤条件:

SELECT name FROM student_info
   WHERE courseId = (SELECT courseId FROM course_info WHERE courseName = 'Biology'); 

使用IN子查询:

SELECT name FROM student_info
   WHERE courseId IN (SELECT courseId FROM course_info WHERE credits > 3); 

使用EXISTS相关子查询:

SELECT name FROM student_info s
   WHERE EXISTS (SELECT 1 FROM course_info c WHERE c.courseId = s.courseId AND c.courseName = 'Biology'); 

使用NOT EXISTS:

SELECT name FROM student_info s
   WHERE NOT EXISTS (SELECT 1 FROM course_info c WHERE c.courseId = s.courseId);

相关文档