子查询表达式

更新时间:

子查询常用于复杂查询中,以便从一个查询的结果集中进一步筛选或处理数据。云原生数据仓库 AnalyticDB PostgreSQL 版兼容PostgreSQL中的所有子查询表达式。本文简单列举云原生数据仓库 AnalyticDB PostgreSQL 版兼容的子查询表达式及用法示例。

PostgreSQL中子查询的详细使用方法,请参见PostgreSQL官方文档:子查询表达式

IN

语法

expression IN (subquery)

参数说明

  • expression:表达式的值将与子查询结果集逐行比较。 如果在子查询结果集中匹配到相等的值,则结果为true。如果未匹配到相等的值,则结果为false。

  • subquery:子查询, 该子查询只能返回一个字段。

示例

orders表中查询某三位客户的订单信息,其中某三位客户来自子查询customer表中c_custkey(客户ID)降序排列的前三名客户。

SELECT * FROM orders WHERE o_custkey IN 
(SELECT c_custkey FROM customer ORDER BY c_custkey DESC LIMIT 3);

NOT IN

语法

expression NOT IN (subquery)

参数说明

expression:表达式的值将与子查询结果集逐行比较。如果在子查询结果集中匹配到相等的值,则结果为false。 如果未匹配到相等的值,那么结果是true。

说明

subquery完全相同时,NOT ININ是相反的查询结果。

示例

orders表中查询除了某三位客户以外其他客户的订单信息,其中某三位客户来自子查询customer表中c_custkey(客户ID)降序排列的前三名客户。

SELECT * FROM orders WHERE o_custkey NOT IN 
(SELECT c_custkey FROM customer ORDER BY c_custkey DESC LIMIT 3);

ALL

语法

expression operator ALL (subquery)

参数说明

  • operator:比较操作符,例如><。该操作符必须生成布尔结果。

  • expression:表达式的值将与子查询结果集逐行比较。 如果所有比较结果均为true,则ALL的结果为true。如果有任何比较结果为false,则ALL的结果为false。如果任何比较结果都没有返回false,且至少有一个比较结果为空,则结果为空值。

示例

如果customer表的c_nationkey列的值均小于50,查询结果显示true。如果有任何一个c_nationkey列的值大于等于50,则返回结果为false。如果c_nationkey列存在空值并且没有false结果,则返回空值。

SELECT 50 > ALL (SELECT c_nationkey FROM customer);  

ANYSOME

语法

expression operator ANY|SOME (subquery)
说明

SOMEANY等价。

参数说明

expression:表达式将被与子查询结果逐行比较。如果有任何比较结果为true,则ANY的结果为true。如果所有比较结果均为false,则结果为false。如果任何比较结果都没有返回true,且至少有一个比较结果为空,则结果为空值。

示例

如果customer表的c_nationkey列的值有小于20的,查询结果显示true。如果所有c_nationkey列的值大于等于20,则返回结果为false。如果c_nationkey列存在空值并且没有true结果,则返回空值。

SELECT 20 > ANY (SELECT c_nationkey FROM customer);  

EXISTS

语法

EXISTS (subquery)

参数说明

subquery:子查询。EXISTS将判断子查询是否返回行。如果子查询返回至少一行,则结果为true。如果没有返回行,则结果为false。

示例

customer表中查找所有在orders表中有对应订单的客户记录,类似对表customerorders做内连接。

SELECT * FROM customer a
WHERE EXISTS 
(SELECT * FROM orders b WHERE a.c_custkey = b.o_custkey)