这个部分介绍了在PolarDB中遵循SQL标准的子查询表达式。所有在这部分提到的表达式返回值都是布尔类型(真/假)结果。

EXISTS

EXISTS的参数是一条以任意形式出现的SELECT语句或者子查询。首先运行子查询语句来决定这个子查询语句是否返回记录。如果至少有一条记录返回,那么EXISTS的结果是”true”,如果子查询没有返回记录,那么EXISTS的结果是”false”。

EXISTS(subquery)

子查询可以参考从它周围查询传递的变量,这样在运行子查询的时候,可以像一个常量那样操作。

通常执行子查询来确定是否至少有一条记录返回,而不是返回的所有记录才结束子查询。写一个有负作用的子查询(例如调用序列函数)是不明智的,而是否有负作用是很难预先判断出来的。

因为EXISTS的返回结果只取决于是否有记录返回,而不是这些记录的内容,子查询的输出列表一般来说没什么意义。一般比较通用的编码约定是以EXISTS(SELECT 1 WHERE…)的形式写所有的EXISTS测试。当然,对于这个规则来说,也有些例外的情况,例如使用INTERSECT的子查询。

这个示例和在列deptno上进行的内连接类似,但是对于每个表dept的记录来说最多只产生一条输出记录,尽管这里有多条匹配的表emp的记录:

SELECT dname FROM dept WHERE EXISTS (SELECT 1 FROM emp WHERE emp.deptno = dept.deptno);

   dname
------------
 ACCOUNTING
 RESEARCH
 SALES
(3 rows)

IN

操作符IN在右侧是括号中的子查询,这个子查询必须只返回一列的内容。计算操作符左侧的表达式,然后与子查询结果中的每条记录进行比较。如果找到与子查询中相匹配的记录,那么IN操作的结果是”true”。如果没有相等记录(包括像子查询没有返回记录这种特定的情况)则结果是”false”。

expression IN (subquery)

需要注意的是如果操作符左侧的表达式产生空值,或者在操作符右侧表中的记录没有与之相等的值,并且至少有一条右侧子查询返回的记录产生空值,那么IN构造的结果将是空值,而不是”false”。这和对于空值和布尔变量组合的SQL一般规则是一致的。

和EXISTS一样,设想子查询会完成对所有涉及记录的查询是不明智的。

NOT IN

在操作符右侧的是括号中的子查询,这个子查询必须只返回一列的内容。计算操作符左侧的表达式,然后与子查询结果中的每条记录进行比较。如果只返回了与子查询中不相等记录(包括特定的情况,也就是子查询没有返回记录),那么NOT IN操作的结果是”true”。如果找到相同的记录,那么返回结果是”false”。

expression NOT IN (subquery)

需要注意的是如果操作符左侧的表达式产生空值,或者在操作符右侧表中的记录没有与之相等的值,并且操作符右侧子查询至少返回一条产生空值的记录,那么 NOT IN 构造的结果将是空值,而不是“true”。这和对于空值和布尔变量组合的SQL一般规则是一致的。

正如和EXISTS一样,设想子查询会完成对所有涉及记录的查询是不明智的。

ANY/SOME

在操作符右侧是括号中的子查询,这个子查询必须只返回一列的内容。计算操作符左侧的表达式,然后使用给定的操作符和子查询结果的每条记录进行比较,最后产生一个BOOLEAN类型的结果。如果取出了返回值为真的结果,那么ANY操作的结果是”true”。如果没有找到返回值为真的结果(包括子查询没有返回记录这种特定的情况),那么结果为”false”。

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

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

需要注意的是如果这里没有成功返回的记录,并且操作符右侧的表达式至少有一行记录对于操作符的结果产生了空值,那么ANY操作构造的结果将是空,而不是”false”。这和对于空值和布尔变量组合的SQL一般规则是一致的。

正如和EXISTS一样,设想子查询会完成对所有涉及记录的查询是不明智的。

ALL

在操作符右侧的是括号中的子查询,这个子查询必须只返回一列的内容。计算操作符左侧的表达式, 然后使用给定的操作符和子查询结果的每条记录进行比较,最后产生一个BOOLEAN类型的结果。如果和所有记录的比较结果都是真(包括子查询没有返回记录这种特殊情况),那么ALL操作的结果是“true”。如果找到任何比较结果为“false”的记录,那么ALL操作的结果是“false”。如果比较操作对于任何记录不返回“false”,并且为至少一条记录返回空值,那么最后结果是“空值”。

expression operator ALL (subquery)

NOT IN 等同于 ‘<> ALL’。

正如和EXISTS一样,设想子查询会完成对所有涉及记录的查询是不明智的。