
# 子查询表达式
#### EXISTS/NOT EXISTS
EXISTS/NOT EXISTS的语法图如[图1]所示。
图1EXISTS/NOT EXISTS::=   
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/figure/zh-cn_image_0000002558213597.png "点击放大")
- EXISTS的参数是一个任意的SELECT语句，或者是子查询。
- 系统对子查询进行运算以判断其结果是否返回行。如果结果至少返回一行，则EXISTS结果就为真；如果子查询没有返回任何行， EXISTS的结果是假。
- 子查询通常只运行到可以判断其是否可以生成至少一行为止，而不是等到全部运算结束。
示例：
```
m_db=# CREATE SCHEMA tpcds;
m_db=# CREATE TABLE tpcds.store_returns
(
  sr_reason_sk     integer,
  sr_reason_id      character(16),
  sr_reason_desc    character(100),
  sr_customer_sk   integer
);
m_db=# CREATE TABLE tpcds.date_dim 
(
  d_dom            integer,
  d_reason_desc    character(100)
);
m_db=# INSERT INTO tpcds.store_returns VALUES(1, 'test_001', 'test_desc_001', 5), (12, 'test_002', 'test_desc_002', 8), (23, 'test_003', 'test_desc_003', 9), (14, 'test_004', 'test_desc_004', 10), (45, 'test_005', 'test_desc_005', 12), (55, 'test_006', 'test_desc_006', 1), (43, 'test_007', 'test_desc_007', 12);
m_db=# INSERT INTO tpcds.date_dim VALUES(1, 'test_dim_desc_001'), (6, 'test_dim_desc_002'), (9, 'test_dim_desc_003'), (19, 'test_dim_desc_004'), (12, 'test_dim_desc_005'), (23, 'test_dim_desc_006');
m_db=# 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 
--------------+----------------
            1 |              5
           12 |              8
           23 |              9
(3 rows)
```
#### IN/NOT IN
IN/NOT IN的语法如[图2]所示。
图2IN/NOT IN::=   
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/figure/zh-cn_image_0000002558053615.png "点击放大")
- IN/NOT IN右侧为一个圆括号括起来的子查询，只返回一个字段。
- IN/NOT IN左侧表达式对子查询结果的每一行进行一次计算和比较。
- 当IN/NOT IN语句中如果含有任何相等的子查询行，则IN结果为真；如果没有相等行，则结果为假（包括子查询没有返回任何行的情况）。
- 表达式或子查询行里的NULL遵守SQL处理布尔值和NULL组合时的规则。如果两个行对应的字段都相等且非空，则这两行相等；如果任意对应字段不相等且非空，则这两行不相等；否则结果是未知（NULL）。如果每一行的结果都是不等或NULL ，并且至少有一个NULL ，则IN的结果是NULL 。
示例：
```
m_db=# 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 
--------------+----------------
           55 |              1
           23 |              9
(2 rows)
```
#### ANY/SOME
ANY/SOME的语法图如[图3]所示。
图3any/some::=   
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/figure/zh-cn_image_0000002526893780.png "点击放大")
- ANY/SOME右边是一个圆括号括起来的子查询，只返回一个字段。
- ANY/SOME左边表达式使用operator对子查询结果的每一行进行一次计算和比较，其结果为布尔值。如果至少获得一个真值，则ANY结果为真；如果全部获得假值，则结果是假（包括子查询没有返回任何行的情况）。SOME是ANY的同义词。IN与ANY可以等效替换 。
示例：
```
m_db=# 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 
--------------+----------------
            1 |              5
           12 |              8
           55 |              1
(3 rows)
```
#### ALL
ALL的语法如[图4]所示。
图4all::=   
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/figure/zh-cn_image_0000002527053728.png "点击放大")
- ALL右边是一个圆括号括起来的子查询，它只返回一个字段。
- ALL左边表达式使用operator对子查询结果的每一行进行一次计算和比较，其结果是布尔值。如果全部获得真值，ALL结果为真（包括子查询没有返回任何行的情况）；如果至少获得一个假值，则结果是假。
示例：
```
m_db=# 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);
 sr_reason_sk | sr_customer_sk 
--------------+----------------
(0 rows)
m_db=# DROP TABLE tpcds.store_returns;
m_db=# DROP TABLE tpcds.date_dim;
m_db=# DROP SCHEMA tpcds;
```
