跳到主要内容

子查询操作符

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

标量子查询

标量子查询仅选择一列或一个表达式,并且最多返回一行。SQL 查询可以在任何期望列或表达式的地方使用标量子查询。

  • 如果标量子查询返回 0 行,Databend 将使用 NULL 作为子查询的输出。
  • 如果标量子查询返回多于一行,Databend 将抛出错误。

示例

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> )
备注
  • 目前仅在 WHERE 子句中支持相关联的 EXISTS 子查询。

示例

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 示例
SELECT *
FROM t1
WHERE t1.a IN (SELECT *
FROM t2);

--
+--------+
| a |
+--------+
| 3 |
+--------+

-- NOT IN 示例
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 来检查比较是否对子查询返回的所有值为真。

  • 关键字 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 |
+--------+
开始使用 Databend Cloud
低成本
快速分析
多种数据源
弹性扩展
注册