更新时间:2024-08-20 GMT+08:00

子查询表达式

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

  • EXISTS/NOT EXISTS

    EXISTS/NOT EXISTS的语法图如图1所示。

    图1 EXISTS/NOT EXISTS::=

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

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

    不支持对XML类型数据操作。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    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所示。

    图2 IN/NOT IN::=

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

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

    不支持对XML类型数据操作。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    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所示。

    图3 any/some::=

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

    不支持对XML类型数据操作。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    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所示。

    图4 all::=

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

    不支持对XML类型数据操作。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    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;