子查询表达式
子查询常用于复杂查询中,以便从一个查询的结果集中进一步筛选或处理数据。云原生数据仓库 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 IN
和IN
是相反的查询结果。
示例
从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);
ANY和SOME
语法
expression operator ANY|SOME (subquery)
SOME和ANY等价。
参数说明
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表中有对应订单的客户记录,类似对表customer和orders做内连接。
SELECT * FROM customer a
WHERE EXISTS
(SELECT * FROM orders b WHERE a.c_custkey = b.o_custkey)