跳到主要内容

子查询操作符

子查询是嵌套在另一个查询中的查询。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)必须跟随比较操作符之一。
  • 如果子查询没有返回任何值,比较计算为假。
  • 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必须跟随比较操作符之一。
  • 如果子查询没有返回任何值,比较计算为真。

语法

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 |
+--------+
这篇文章对您有帮助吗?
Yes
No
开始使用 Databend Cloud
低成本
快速分析
多种数据源
弹性扩展
注册