子查询表达式

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

  • EXISTS/NOT EXISTS

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

图 1 EXISTS/NOT EXISTS::= 子查询表达式 - 图1

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

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

示例:

1. openGauss=# 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); 2. sr_reason_sk | sr_customer_sk 3. --------------+---------------- 4. 13 | 2 5. 22 | 5 6. 17 | 7 7. 25 | 7 8. 3 | 7 9. 31 | 5 10. 7 | 7 11. 14 | 6 12. 20 | 4 13. 5 | 6 14. 10 | 3 15. 1 | 5 16. 15 | 2 17. 4 | 1 18. 26 | 3 19. (15 rows) - IN/NOT IN

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

图 2 IN/NOT IN::= 子查询表达式 - 图2

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

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

示例:

1. openGauss=# 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); 2. sr_reason_sk | sr_customer_sk 3. --------------+---------------- 4. 10 | 3 5. 26 | 3 6. 22 | 5 7. 31 | 5 8. 1 | 5 9. 32 | 5 10. 32 | 5 11. 4 | 1 12. 15 | 2 13. 13 | 2 14. 33 | 4 15. 20 | 4 16. 33 | 8 17. 5 | 6 18. 14 | 6 19. 17 | 7 20. 3 | 7 21. 25 | 7 22. 7 | 7 23. (19 rows) - ANY/SOME

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

图 3 any/some::= 子查询表达式 - 图3

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

示例:

1. openGauss=# 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); 2. sr_reason_sk | sr_customer_sk 3. --------------+---------------- 4. 26 | 3 5. 17 | 7 6. 32 | 5 7. 32 | 5 8. 13 | 2 9. 31 | 5 10. 25 | 7 11. 5 | 6 12. 7 | 7 13. 10 | 3 14. 1 | 5 15. 14 | 6 16. 4 | 1 17. 3 | 7 18. 22 | 5 19. 33 | 4 20. 20 | 4 21. 33 | 8 22. 15 | 2 23. (19 rows) - ALL

ALL的语法请参见图4。

图 4 all::= 子查询表达式 - 图4

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

示例:

1. openGauss=# SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE sr_customer_sk < all(SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10); 2. sr_reason_sk | sr_customer_sk 3. --------------+---------------- 4. (0 rows)