VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

子查询表达式

子查询表达式主要有以下几种:

EXISTS/NOT EXISTS

EXISTS/NOT EXISTS的语法图请参见图1

图 1 EXISTS/NOT EXISTS::=

EXISTS的参数是一个任意的SELECT语句,或者说子查询。系统对子查询进行运算以判断它是否返回行。如果它至少返回一行,则EXISTS结果就为“真”;如果子查询没有返回任何行,EXISTS的结果是“假”。

这个子查询通常只是运行到能判断它是否可以生成至少一行为止,而不是等到全部结束。

示例

1、创建如下测试表并插入测试数据。

CREATE TABLE store_returns1 (
    sr_reason_sk INT,
    sr_customer_sk INT
);
INSERT INTO store_returns1 (sr_reason_sk, sr_customer_sk) VALUES (1, 5), (2, 8), (3, 9);
CREATE TABLE date_dim1 (
    d_date_sk INT,
    d_dom INT,
    d_month INT
);
INSERT INTO date_dim1 (d_date_sk, d_dom, d_month) VALUES (100, 1, 1), (100, 2, 1), (100, 3, 1), (100, 4, 1), (100, 5, 1), (100, 6, 1), (100, 7, 1), (100, 8, 1), (100, 9, 1), (100, 10, 1), (100, 11, 1), (100, 12, 1);

2、执行如下子查询表达式:

SELECT sr_reason_sk,sr_customer_sk FROM store_returns1 WHERE EXISTS (SELECT d_dom FROM date_dim1 WHERE d_dom = store_returns1.sr_reason_sk and sr_customer_sk <10);

返回结果如下:

 sr_reason_sk | sr_customer_sk
--------------+----------------
            1 |              5
            2 |              8
            3 |              9
(3 rows)

IN/NOT IN

IN/NOT IN的语法请参见图2

图 2 IN/NOT IN::=

右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式对子查询结果的每一行进行一次计算和比较。如果找到任何相等的子查询行,则IN结果为“真”。如果没有找到任何相等行,则结果为“假”(包括子查询没有返回任何行的情况)。

表达式或子查询行里的NULL遵照SQL处理布尔值和NULL组合时的规则:

  • 如果两个行对应的字段都相等且非空,则这两行相等;
  • 如果任意对应字段不等且非空,则这两行不等;否则结果是未知(NULL)。
  • 如果每一行的结果都是不等或NULL ,并且至少有一个NULL ,则IN的结果是NULL 。

示例

1、创建如下测试表并插入测试数据。

CREATE TABLE store_returns2 (
    sr_reason_sk INT,
    sr_customer_sk INT
);
INSERT INTO store_returns2 (sr_reason_sk, sr_customer_sk) VALUES (1, 5), (2, 8), (3, 9);
CREATE TABLE date_dim2 (
    d_date_sk INT,
    d_dom INT,
    d_month INT
);
INSERT INTO date_dim2 (d_date_sk, d_dom, d_month) VALUES (100, 1, 1), (100, 2, 1), (100, 3, 1), (100, 4, 1), (100, 5, 1), (100, 6, 1), (100, 7, 1), (100, 8, 1), (100, 9, 1), (100, 10, 1), (100, 11, 1), (100, 12, 1);

2、执行如下子查询表达式:

SELECT sr_reason_sk,sr_customer_sk  FROM store_returns2 WHERE sr_customer_sk IN (SELECT d_dom FROM date_dim2 WHERE d_dom < 10);

返回结果如下:

 sr_reason_sk | sr_customer_sk
--------------+----------------
            1 |              5
            2 |              8
            3 |              9
(3 rows)

ANY/SOME

ANY/SOME的语法图请参见图3

图 3 any/some::=

右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较,其结果必须是布尔值。

  • 如果至少获得一个真值,则ANY结果为“真”。
  • 如果全部获得假值,则结果是“假”(包括子查询没有返回任何行的情况)。
  • SOME是ANY的同义词;IN与ANY可以等效替换 。

示例

1、创建如下测试表并插入测试数据。

CREATE TABLE store_returns3 (
    sr_reason_sk INT,
    sr_customer_sk INT
);
INSERT INTO store_returns3 (sr_reason_sk, sr_customer_sk) VALUES (1, 5), (2, 8), (3, 9);
CREATE TABLE date_dim3 (
    d_date_sk INT,
    d_dom INT,
    d_month INT
);
INSERT INTO date_dim3 (d_date_sk, d_dom, d_month) VALUES (100, 1, 1), (100, 2, 1), (100, 3, 1), (100, 4, 1), (100, 5, 1), (100, 6, 1), (100, 7, 1), (100, 8, 1), (100, 9, 1), (100, 10, 1), (100, 11, 1), (100, 12, 1);

2、执行如下子查询表达式:

SELECT sr_reason_sk,sr_customer_sk  FROM store_returns3 WHERE sr_customer_sk < ANY (SELECT d_dom FROM date_dim3 WHERE d_dom < 10);

返回结果如下:

 sr_reason_sk | sr_customer_sk
--------------+----------------
            1 |              5
            2 |              8
(2 rows)

ALL

ALL的语法请参见图4

图 4 all::=

右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较,其结果必须是布尔值。

  • 如果全部获得真值,ALL结果为“真”(包括子查询没有返回任何行的情况)。
  • 如果至少获得一个假值,则结果是“假”。

示例

1、创建如下测试表并插入测试数据。

CREATE TABLE store_returns4 (
    sr_reason_sk INT,
    sr_customer_sk INT
);
INSERT INTO store_returns4 (sr_reason_sk, sr_customer_sk) VALUES (1, 5), (2, 8), (3, 9);
CREATE TABLE date_dim4 (
    d_date_sk INT,
    d_dom INT,
    d_month INT
);
INSERT INTO date_dim4 (d_date_sk, d_dom, d_month) VALUES (100, 1, 1), (100, 2, 1), (100, 3, 1), (100, 4, 1), (100, 5, 1), (100, 6, 1), (100, 7, 1), (100, 8, 1), (100, 9, 1), (100, 10, 1), (100, 11, 1), (100, 12, 1);

2、执行如下子查询表达式:

SELECT sr_reason_sk,sr_customer_sk  FROM store_returns4 WHERE sr_customer_sk < all(SELECT d_dom FROM date_dim4 WHERE d_dom < 10);    

返回结果如下:

 sr_reason_sk | sr_customer_sk
--------------+----------------
(0 rows)