📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

子查询运算符



子查询是嵌套在另一个查询中的查询。TiDB Cloud Lake 支持以下子查询类型:

标量子查询

标量子查询只选择一列或一个表达式,并且最多只返回一行。SQL 查询可以在任何需要列或表达式的位置使用标量子查询。

  • 如果标量子查询返回 0 行,TiDB Cloud Lake 会使用 NULL 作为子查询输出。
  • 如果标量子查询返回多于一行,TiDB Cloud Lake 会抛出错误。

示例

CREATE TABLE t1 (a int); CREATE TABLE t2 (a int); INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); INSERT INTO t2 VALUES (3); INSERT INTO t2 VALUES (4); INSERT INTO t2 VALUES (5); SELECT * FROM t1 WHERE t1.a < (SELECT Min(t2.a) FROM t2); -- +--------+ | a | +--------+ | 1 | | 2 | +--------+

EXISTS / NOT EXISTS

EXISTS 子查询是一个可以出现在 WHERE 子句中的布尔表达式:

  • 如果子查询产生了任意行,EXISTS 表达式的计算结果为 TRUE。
  • 如果子查询没有产生任何行,NOT EXISTS 表达式的计算结果为 TRUE。

语法

[ NOT ] EXISTS ( <query> )

示例

SELECT number FROM numbers(10) WHERE number>5 AND exists(SELECT number FROM numbers(5) WHERE number>4);

SELECT number FROM numbers(5) WHERE number>4 不会产生任何行,因此 exists(SELECT number FROM numbers(5) WHERE number>4) 为 FALSE。

SELECT number FROM numbers(10) WHERE number>5 and exists(SELECT number FROM numbers(5) WHERE number>3); +--------+ | number | +--------+ | 6 | | 7 | | 8 | | 9 | +--------+

EXISTS(SELECT NUMBER FROM NUMBERS(5) WHERE NUMBER>3) 为 TRUE。

SELECT number FROM numbers(10) WHERE number>5 AND not exists(SELECT number FROM numbers(5) WHERE number>4); +--------+ | number | +--------+ | 6 | | 7 | | 8 | | 9 | +--------+

not exists(SELECT number FROM numbers(5) WHERE number>4) 为 TRUE。

IN / NOT IN

使用 IN 或 NOT IN,可以检查某个表达式是否与子查询返回的值列表中的任意值匹配。

  • 使用 IN 或 NOT IN 时,子查询必须返回单列值。

语法

[ NOT ] IN ( <query> )

示例

CREATE TABLE t1 (a int); CREATE TABLE t2 (a int); INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); INSERT INTO t2 VALUES (3); INSERT INTO t2 VALUES (4); INSERT INTO t2 VALUES (5); -- IN example SELECT * FROM t1 WHERE t1.a IN (SELECT * FROM t2); -- +--------+ | a | +--------+ | 3 | +--------+ -- NOT IN example SELECT * FROM t1 WHERE t1.a NOT IN (SELECT * FROM t2); -- +--------+ | a | +--------+ | 1 | | 2 | +--------+

ANY (SOME)

可以使用 ANY(或 SOME)来检查某个比较对于子查询返回的任意一个值是否为真。

  • 关键字 ANY(或 SOME)必须跟在某个比较运算符之后。
  • 如果子查询未返回任何值,则该比较的计算结果为 false。
  • SOME 的工作方式与 ANY 相同。

语法

-- ANY comparison_operator ANY ( <query> ) -- SOME comparison_operator SOME ( <query> )

示例

CREATE TABLE t1 (a int); CREATE TABLE t2 (a int); INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); INSERT INTO t2 VALUES (3); INSERT INTO t2 VALUES (4); INSERT INTO t2 VALUES (5); SELECT * FROM t1 WHERE t1.a < ANY (SELECT * FROM t2); -- +--------+ | a | +--------+ | 1 | | 2 | | 3 | +--------+

ALL

你可以使用 ALL 来检查某个比较对于子查询返回的所有值是否都为 true。

  • 关键字 ALL 必须跟在某个比较运算符之后。
  • 如果子查询未返回任何值,则该比较的计算结果为 true。

语法

comparison_operator ALL ( <query> )

示例

CREATE TABLE t1 (a int); CREATE TABLE t2 (a int); INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); INSERT INTO t2 VALUES (3); INSERT INTO t2 VALUES (4); INSERT INTO t2 VALUES (5); SELECT * FROM t1 WHERE t1.a < ALL (SELECT * FROM t2); -- +--------+ | a | +--------+ | 1 | | 2 | +--------+

文档内容是否有帮助?