更新时间: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);
父主题: 子句