Postgres 子查询 介绍

来源:互联网 发布:花纹板理论价格算法 编辑:程序博客网 时间:2024/06/03 21:37

Postgres子查询主要包含如下几个关键字: EXISTS, IN, NOT IN, ANY/SOME, ALL,详细介绍如下:

EXISTS

EXISTS (subquery)

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

子查询可以引用来自周围的查询的变量,这些变量在该子查询的任何一次计算中都起常量的作用。

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

因为结果只取决于是否会返回行,而不取决于这些行的内容, 所以这个子查询的输出列表通常是无关紧要的。

下面这个简单的例子类似在col2上的一次内联接,但是它为每个 tab1的行生成最多一个输出,即使存在多个匹配tab2的行也如此∶

SELECT col1FROM tab1WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

IN

expression IN (subquery)

关键字’IN’的右侧是一个圆括弧括起来的子查询, 它必须返回一个列。expressio将被计算并与subquery结果逐行进行比较。 如果找到任何等于子查询行的值,那么IN的结果就是”真”。 如果没有找到,那么结果是”假”(包括子查询没有返回任何行的情况)。

如果expression表达式得到空值,或者没有相等子查询值, 且至少有一个子查询得到空值,那么IN结构的结果将是空值,而不是假。这点时遵循SQL标准。

和EXISTS一样,假设子查询将被完全运行是不明智的。

row_constructor IN (subquery)

这种形式的IN的左侧是一个行构造器, 右侧是一个圆括弧子查询,它必须返回和左侧的行中表达式所构成的完全一样多的列。 表达式将被计算并与子查询结果逐行进行比较。如果找到任意相等的子查询行,则IN的结果为”true”。如果没有找到相等行, 那么结果为”假”(包括子查询不返回行的情况)。

通常,表达式或者子查询行里的空值是按照 SQL 布尔表达式的一般规则进行组合的。 如果两个行对应的成员都非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么这两行不等; 否则这样的行比较的结果是未知(空值)。如果所有行的结果要么是不等, 要么是空值,并且至少有一个空值,那么IN的结果是空值。

NOT IN

expression NOT IN (subquery)

关键字’NOT IN’是一个用圆括号括起的子查询,它必须返回一列。左侧表达式将被计算并与子查询结果逐行进行比较。 如果只找到不相等的子查询行(包括子查询不返回行的情况),那么NOT IN的结果是”真”。 如果找到任何相等行,则结果为”假”。

如果左侧表达式得到空值,或者没有相等的右手边值, 并且至少有一个右手边行得到空值,那么NOT IN结构的结果将是空值,而不是真。这个行为是遵照 SQL 标准。

和EXISTS一样,假设子查询完全结束是不明智的。

row_constructor NOT IN (subquery)

这种形式的NOT IN的左侧是一个行构造器,右侧是一个圆括弧子查询,它必须返回和左手边返回的行中表达式所构成的完全一样多的列。 左手边表达式将被计算并与子查询结果逐行进行比较。如果找到不等于子查询行的行,则NOT IN的结果为”true”。如果找到相等行, 那么结果为”假”(包括子查询不返回行的情况)。

通常,表达式或者子查询行里的空值是按照 SQL 布尔表达式的一般规则进行组合的。 如果两个行对应的成员都非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么这两行不等; 否则这样的行比较的结果是未知(空值)。如果所有行的结果要么是不等, 要么是空值,并且至少有一个空值,那么NOT IN的结果是空值。

ANY/SOME

expression operator ANY (subquery)expression operator SOME (subquery)

关键字右侧是一个圆括弧括起来的子查询, 它必须返回一列。左侧表达式将被计算并使用给出的操作符对子查询结果逐行进行比较。如果获得任何真值结果,那么ANY的结果就是”真”。 如果没有找到真值结果,那么结果是”假”(包括子查询没有返回任何行的情况)。

SOME是ANY的同义词。IN等价于= ANY。

请注意如果没有任何成功并且至少有一个右手边行为该操作符结果生成空值, 那么ANY结构的结果将是空值,而不是假。 这个行为是遵照 SQL 标准。

和EXISTS一样,假设子查询将被完全运行是不明智的。

row_constructor operator ANY (subquery)row_constructor operator SOME (subquery)

关键字左侧是一个行构造器,右侧是一个圆括弧括起来的子查询, 它必须返回和左侧构造的表达式一样多的列。左侧表达式将被计算并使用给出的操作符对子查询结果逐行进行比较。如果比较为任何子查询行返回真,则ANY的结果为”真”。如果比较对每一个子查询行都返回假,则结果为”假”(包括子查询不返回行的情况)。如果比较不对任何行返回真并且至少对一行返回 NULL,则结果为 NULL。

ALL

expression operator ALL (subquery)

ALL 的这种形式的右侧是一个圆括弧括起来的子查询, 它必须返回一列。左侧表达式将被计算并使用给出的操作符对子查询结果逐行进行比较。该操作符必须生成布尔结果。 如果所有行得到真(包括子查询没有返回任何行的情况),ALL的结果就是”真”。如果没有存在任何假值结果,那么结果是”假”。如果比较为任何行都不返回假并且对至少一行返回 NULL,则结果为 NULL。

NOT IN等价于<> ALL。

和EXISTS一样,假设子查询将被完全运行是不明智的。

row_constructor operator ALL (subquery)

ALL的这种形式的左侧是一个行构造器,右侧是一个圆括弧括起来的子查询,它必须返回和左侧中表达式一样多的列。 左手边表达式将被计算并使用给出的 操作符对子查询结果逐行进行比较。如果对所有子查询行该比较都返回真,那么ALL的结果就是”真”(包括子查询没有返回任何行的情况)。如果对任何子查询行比较返回假,则结果为”假”。如果比较对任何子查询行都不返回假并且对至少一行返回 NULL,则结果为 NULL。

0 0