
# 子查询表达式
子查询表达式主要有以下几种：
- EXISTS/NOT EXISTS EXISTS/NOT EXISTS的语法图如[图1]所示。
  图1EXISTS/NOT EXISTS::=   
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002558057187.png "点击放大")
  EXISTS的参数是一个任意的SELECT语句，即子查询。系统对子查询进行运算以判断它是否返回行。如果它至少返回一行，则EXISTS结果就为"真"；如果子查询没有返回任何行， EXISTS的结果是"假"。
  这个子查询通常只是运行到能判断它是否可以生成至少一行为止，而不是等到全部结束。
  不支持对XML类型数据操作。
  示例：
  ```
  gaussdb=# CREATE TABLE exists_t1(a int, b int);
  gaussdb=# INSERT INTO exists_t1 VALUES(1, 2),(2, 3),(3, 4),(4, 5);
  gaussdb=# CREATE TABLE exists_t2(a int, c int);
  gaussdb=# INSERT INTO exists_t2 VALUES(3, 4),(4, 5),(5, 6),(6, 7);
  gaussdb=# SELECT * FROM exists_t1 t1 WHERE EXISTS (SELECT * FROM exists_t2 t2 WHERE t2.a = t1.a); 
   a | b 
  ---+---
   3 | 4
   4 | 5
  (2 rows)
  gaussdb=# DROP TABLE exists_t1, exists_t2;
  ```
  
- IN/NOT IN IN/NOT IN的语法如[图2]所示。
  图2IN/NOT IN::=   
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002558057173.png "点击放大")
  右边是一个圆括弧括起来的子查询，它必须只返回一个字段。左边表达式对子查询结果的每一行进行一次计算和比较。如果找到任何相等的子查询行，则IN结果为"真"。如果没有找到任何相等行，则结果为"假"（包括子查询没有返回任何行的情况）。
  表达式或子查询行里的NULL遵照SQL处理布尔值和NULL组合时的规则。如果两个行对应的字段都相等且非空，则这两行相等；如果任意对应字段不等且非空，则这两行不等；否则结果是未知（NULL）。如果每一行的结果都是不等或NULL ，并且至少有一个NULL ，则IN的结果是NULL 。
  不支持对XML类型数据操作。
  示例：
  ```
  gaussdb=# CREATE TABLE in_t1(a int, b int);
  gaussdb=# INSERT INTO in_t1 VALUES(1, 2),(2, 3),(3, 4),(4, 5);
  gaussdb=# CREATE TABLE in_t2(a int, c int);
  gaussdb=# INSERT INTO in_t2 VALUES(3, 4),(4, 5),(5, 6),(6, 7);
  gaussdb=# SELECT * FROM in_t1 t1 WHERE t1.a IN (SELECT t2.a FROM in_t2 t2); 
   a | b 
  ---+---
   3 | 4
   4 | 5
  (2 rows)
  gaussdb=# DROP TABLE in_t1, in_t2;
  ```
  
- ANY/SOME ANY/SOME的语法图如[图3]所示。
  图3any/some::=   
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002558217145.png "点击放大")
  右边是一个圆括弧括起来的子查询，它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较，其结果必须是布尔值。如果至少获得一个真值，则ANY结果为"真"。如果全部获得假值，则结果是"假"（包括子查询没有返回任何行的情况）。SOME是ANY的同义词。IN与ANY可以等效替换 。
  不支持对XML类型数据操作。
  示例：
  ```
  gaussdb=# CREATE TABLE any_t1(a int, b int);
  gaussdb=# INSERT INTO any_t1 VALUES(1, 2),(2, 3),(3, 4),(4, 5);
  gaussdb=# CREATE TABLE any_t2(a int, c int);
  gaussdb=# INSERT INTO any_t2 VALUES(3, 4),(4, 5),(5, 6),(6, 7);
  gaussdb=# SELECT * FROM any_t1 t1 WHERE t1.a < ANY(SELECT t2.a FROM any_t2 t2 where t2.a = 3 or t2.a = 4); 
   a | b 
  ---+---
   1 | 2
   2 | 3
   3 | 4
  (3 rows)
  gaussdb=# DROP TABLE any_t1, any_t2;
  ```
  
- ALL ALL的语法如[图4]所示。
  图4all::=   
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002527057294.png "点击放大")
  右边是一个圆括弧括起来的子查询，它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较，其结果必须是布尔值。如果全部获得真值，ALL结果为"真"（包括子查询没有返回任何行的情况）。如果至少获得一个假值，则结果是"假"。
  不支持对XML类型数据操作。
  示例：
  ```
  gaussdb=# CREATE TABLE all_t1(a int, b int);
  gaussdb=# INSERT INTO all_t1 VALUES(1, 2),(2, 3),(3, 4),(4, 5);
  gaussdb=# CREATE TABLE all_t2(a int, c int);
  gaussdb=# INSERT INTO all_t2 VALUES(3, 4),(4, 5),(5, 6),(6, 7);
  gaussdb=# SELECT * FROM all_t1 t1 WHERE t1.a < ALL(SELECT t2.a FROM all_t2 t2 where t2.a = 3 or t2.a = 4); 
   a | b 
  ---+---
   1 | 2
   2 | 3
  (2 rows)
  gaussdb=# DROP TABLE all_t1, all_t2;
  ```
  
 
