## 9.23.子查询表达式 [9.23.1.`存在`](functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS) [9.23.2.`在里面`](functions-subquery.html#FUNCTIONS-SUBQUERY-IN) [9.23.3.`不在`](functions-subquery.html#FUNCTIONS-SUBQUERY-NOTIN) [9.23.4.`任何`/`一些`](functions-subquery.html#FUNCTIONS-SUBQUERY-ANY-SOME) [9.23.5.`全部的`](functions-subquery.html#FUNCTIONS-SUBQUERY-ALL) [9.23.6. 单行比较](functions-subquery.html#id-1.5.8.29.15) [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>) 本节介绍PostgreSQL中可用的与SQL兼容的子查询表达式。本节中记录的所有表达式形式都返回布尔(真/假)结果。 ### 9.23.1.`存在` ``` EXISTS (subquery) ``` 的论点`存在`这是一种武断的行为`选择`声明,或*子查询*.对子查询进行求值,以确定它是否返回任何行。如果它返回至少一行,则`存在`是“真的”;如果子查询不返回任何行,则`存在`是“假”。 子查询可以引用周围查询中的变量,这些变量将在子查询的任何一次计算中充当常量。 子查询通常只执行足够长的时间,以确定是否至少返回一行,而不是一直执行到完成。编写具有副作用(例如调用序列函数)的子查询是不明智的;副作用是否发生可能无法预测。 由于结果只取决于是否返回任何行,而不取决于这些行的内容,因此子查询的输出列表通常并不重要。一种常见的编码约定是编写所有`存在`表格中的测试`存在(选择1,其中…)`。但是,此规则也有例外,例如使用`横断`. 这个简单的例子就像一个内部连接`可乐2`,但它最多为每一行生成一个输出行`表1`行,即使有多个匹配`表2`排: ``` SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2); ``` ### 9.23.2. `在里面` ``` expression IN (subquery) ``` 右边是一个带括号的子查询,它必须只返回一列。对左侧表达式求值,并与子查询结果的每一行进行比较。结果`在里面`如果找到任何相等的子查询行,则为“true”。如果没有找到相等的行(包括子查询不返回行的情况),则结果为“false”。 请注意,如果左侧表达式产生null,或者如果没有相等的右侧值,并且至少有一行右侧表达式产生null,则`在里面`构造将为null,而不是false。这符合SQL关于空值布尔组合的常规规则。 就像`存在`,假设子查询将被完全计算是不明智的。 ``` row_constructor IN (subquery) ``` 这张照片的左边`在里面`是行构造函数,如中所述[第4.2.13节](sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS).右侧是一个带括号的子查询,它返回的列数必须与左侧行中的表达式数完全相同。左侧表达式将按行计算并与子查询结果的每一行进行比较。结果`在里面`如果找到任何相等的子查询行,则为“true”。如果没有找到相等的行(包括子查询不返回行的情况),则结果为“false”。 通常,行中的空值是按照SQL布尔表达式的常规规则组合的。如果两行的所有对应成员都非空且相等,则认为这两行相等;如果任何对应的成员非空且不相等,则行不相等;否则,该行比较的结果未知(null)。如果所有每行结果都不相等或为空,且至少有一个为空,则`在里面`是空的。 ### 9.23.3. `不在` ``` expression NOT IN (subquery) ``` 右边是一个带括号的子查询,它必须只返回一列。对左侧表达式求值,并与子查询结果的每一行进行比较。结果`不在`如果只找到不相等的子查询行(包括子查询不返回行的情况),则为“true”。如果找到任何相等的行,则结果为“false”。 请注意,如果左侧表达式产生null,或者如果没有相等的右侧值,并且至少有一行右侧表达式产生null,则`不在`构造将为null,而不是true。这符合SQL关于空值布尔组合的常规规则。 就像`存在`,假设子查询将被完全计算是不明智的。 ``` row_constructor NOT IN (subquery) ``` 这张照片的左边`不在`是行构造函数,如中所述[第4.2.13节](sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS).右侧是一个带括号的子查询,它返回的列数必须与左侧行中的表达式数完全相同。左侧表达式将按行计算并与子查询结果的每一行进行比较。结果`不在`如果只找到不相等的子查询行(包括子查询不返回行的情况),则为“true”。如果找到任何相等的行,则结果为“false”。 通常,行中的空值是按照SQL布尔表达式的常规规则组合的。如果两行的所有对应成员都非空且相等,则认为这两行相等;如果任何对应的成员非空且不相等,则行不相等;否则,该行比较的结果未知(null)。如果所有每行结果都不相等或为空,且至少有一个为空,则`不在`是空的。 ### 9.23.4. `任何`/`一些` ``` expression operator ANY (subquery) expression operator SOME (subquery) ``` 右边是一个带括号的子查询,它必须只返回一列。使用给定的表达式计算左侧表达式,并与子查询结果的每一行进行比较*`操作人员`*,它必须产生一个布尔结果。结果`任何`如果得到任何真实结果,则为“真”。如果没有找到真正的结果(包括子查询不返回任何行的情况),则结果为“false”。 `一些`是的同义词`任何`. `在里面`相当于`=任何`. 请注意,如果没有成功,并且至少有一行右边的运算符结果为null,则`任何`构造将为null,而不是false。这符合SQL关于空值布尔组合的常规规则。 就像`存在`,假设子查询将被完全计算是不明智的。 ``` row_constructor operator ANY (subquery) row_constructor operator SOME (subquery) ``` 这张照片的左边`任何`是行构造函数,如中所述[第4.2.13节](sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS).右侧是一个带括号的子查询,它返回的列数必须与左侧行中的表达式数完全相同。使用给定的表达式,按行计算左侧表达式,并将其与子查询结果的每一行进行比较*`操作人员`*.结果`任何`如果对任何子查询行的比较返回true,则为“true”。如果每个子查询行的比较结果都返回false(包括子查询不返回行的情况),则结果为“false”。如果与子查询行的比较没有返回true,并且至少有一个比较返回NULL,则结果为NULL。 看见[第9.24.5节](functions-comparisons.html#ROW-WISE-COMPARISON)有关行构造函数比较的含义的详细信息。 ### 9.23.5. `全部的` ``` expression operator ALL (subquery) ``` 右边是一个带括号的子查询,它必须只返回一列。使用给定的表达式计算左侧表达式,并与子查询结果的每一行进行比较*`操作人员`*,它必须产生一个布尔结果。结果`全部的`如果所有行都返回true(包括子查询不返回行的情况),则为“true”。如果发现任何错误结果,则结果为“错误”。如果与子查询行的比较没有返回false,并且至少有一个比较返回NULL,则结果为NULL。 `不在`相当于`<>全部`. 就像`存在`,假设子查询将被完全计算是不明智的。 ``` row_constructor operator ALL (subquery) ``` 这张照片的左边`全部的`是行构造函数,如中所述[第4.2.13节](sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS).右侧是一个带括号的子查询,它返回的列数必须与左侧行中的表达式数完全相同。使用给定的表达式,按行计算左侧表达式,并将其与子查询结果的每一行进行比较*`操作人员`*.结果`全部的`如果对所有子查询行(包括子查询不返回行的情况)进行比较,则为“true”。如果对任何子查询行的比较返回false,则结果为“false”。如果与子查询行的比较没有返回false,并且至少有一个比较返回NULL,则结果为NULL。 看见[第9.24.5节](functions-comparisons.html#ROW-WISE-COMPARISON)有关行构造函数比较的含义的详细信息。 ### 9.23.6.单行比较 [](<>) ``` row_constructor operator (subquery) ``` 左侧是行构造函数,如中所述[第4.2.13节](sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS).右侧是一个带括号的子查询,它返回的列数必须与左侧行中的表达式数完全相同。此外,子查询不能返回多行。(如果返回零行,则结果为空。)左侧将按行计算并与单个子查询结果行进行比较。 看见[第9.24.5节](functions-comparisons.html#ROW-WISE-COMPARISON)有关行构造函数比较的含义的详细信息。