ITPub博客

首页 > 数据库 > > 表达式-子查询表达式

表达式-子查询表达式

作者:GaussDB_数据库 时间:2020-01-15 17:04:49 0 删除 编辑

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

  • EXISTS/NOT EXISTS

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

    图1 EXISTS/NOT EXISTS::=
    GaussDB EXISTS/NOT EXISTS::=

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

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

    示例:

    SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE EXISTS (SELECT d_dom FROM tpcds.date_dim WHERE d_dom = store_returns.sr_reason_sk and sr_customer_sk <10);
    sr_reason_sk | sr_customer_sk
    --------------+----------------
    13 | 2
    22 | 5
    17 | 7
    25 | 7
    3 | 7
    31 | 5
    7 | 7
    14 | 6
    20 | 4
    5 | 6
    10 | 3
    1 | 5
    15 | 2
    4 | 1
    26 | 3
    (15 rows)
  • IN/NOT IN

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

    图2 IN/NOT IN::=
    GaussDB IN/NOT IN::=

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

    表达式或子查询行里的NULL遵照SQL处理布尔值和NULL组合时的规则。如果两个行对应的字段都相等且非空,则这两行相等;如果任意对应字段不等且非空,则这两行不等;否则结果是未知(NULL)。如果每一行的结果都是不等或NULL ,并且至少有一个NULL ,则IN的结果是NULL 。

    示例:

    SELECT sr_reason_sk,sr_customer_sk  FROM tpcds.store_returns WHERE sr_customer_sk IN (SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10);
    sr_reason_sk | sr_customer_sk
    --------------+----------------
    10 | 3
    26 | 3
    22 | 5
    31 | 5
    1 | 5
    32 | 5
    32 | 5
    4 | 1
    15 | 2
    13 | 2
    33 | 4
    20 | 4
    33 | 8
    5 | 6
    14 | 6
    17 | 7
    3 | 7
    25 | 7
    7 | 7
    (19 rows)
  • ANY/SOME

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

    图3 any/some::=
    GaussDB any/some::=

    右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较,其结果必须是布尔值。如果至少获得一个真值,则ANY结果为“真”。如果全部获得假值,则结果是“假”(包括子查询没有返回任何行的情况)。SOME是ANY的同义词。IN与ANY可以等效替换 。

    示例:

    SELECT sr_reason_sk,sr_customer_sk  FROM tpcds.store_returns WHERE sr_customer_sk < ANY (SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10);
    sr_reason_sk | sr_customer_sk
    --------------+----------------
    26 | 3
    17 | 7
    32 | 5
    32 | 5
    13 | 2
    31 | 5
    25 | 7
    5 | 6
    7 | 7
    10 | 3
    1 | 5
    14 | 6
    4 | 1
    3 | 7
    22 | 5
    33 | 4
    20 | 4
    33 | 8
    15 | 2
    (19 rows)
  • ALL

    ALL的语法请参见图4。

    图4 all::=
    GaussDB all::=

    右边是一个圆括弧括起来的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较,其结果必须是布尔值。如果全部获得真值,ALL结果为"真"(包括子查询没有返回任何行的情况)。如果至少获得一个假值,则结果是"假"。

    示例:

    SELECT sr_reason_sk,sr_customer_sk  FROM tpcds.store_returns WHERE sr_customer_sk < all(SELECT d_dom FROMOM tpcds.date_dim WHERE d_dom < 10);
    sr_reason_sk | sr_customer_sk
    --------------+----------------
    (0 rows)


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3147409/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19311