1. EXISTS
EXISTS (subquery)
EXISTS的参数是一个任意的SELECT语句, 或者说子查询。
系统对子查询进行运算以判断它是否返回行。
如果它至少返回一行,那么EXISTS的结果就为“真”;
如果子查询没有返回行,那么EXISTS的结果是“假”。
子查询可以引用来自周围的查询的变量,这些变量在该子查询的任何一次计算中都起常量的作用。
这个子查询通常只是运行到能判断它是否可以返回至少一行为止, 而不是等到全部结束
下面这个简单的例子类似在col2上的一次内联接,但是它为每个 tab1的行生成最多一个输出,即使存在多个匹配tab2的行也如此∶
SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
2. IN
expression IN (subquery)
右手边是一个圆括弧括起来的子查询, 它必须正好只返回一个列。
左手边表达式将被计算并与子查询结果逐行进行比较。
如果找到任何等于子查询行的情况,那么IN的结果就是“真”。
如果没有找到相等行,那么结果是“假”(包括子查询没有返回任何行的情况)。
请注意如果左手边表达式得到空值,或者没有相等的右手边值, 并且至少有一个右手边行得到空值,那么IN结构的结果将是空值,而不是假。
3. NOT IN
expression NOT IN (subquery)
右手边是一个用圆括弧包围的子查询,它必须返回正好一个列。
左手边表达式将被计算并与子查询结果逐行进行比较。
如果只找到不相等的子查询行(包括子查询不返回行的情况),那么NOT IN的结果是“真”。 如果找到任何相等行,则结果为“假”。
4. ANY/SOME
expression operator ANY (subquery)
expression operator SOME (subquery)
这种形式的右手边是一个圆括弧括起来的子查询, 它必须返回正好一个列。
左手边表达式将被计算并使用给出的 操作符对子查询结果逐行进行比较。
如果获得任何真值结果,那么ANY的结果就是“真”。
如果没有找到真值结果,那么结果是“假”(包括子查询没有返回任何行的情况)。
SOME是ANY的同义词。IN等价于= ANY。
5. ALL
expression operator ALL (subquery)
ALL 的这种形式的右手边是一个圆括弧括起来的子查询, 它必须只返回一列。
左手边表达式将被计算并使用给出的 操作符对子查询结果逐行进行比较。
该操作符必须生成布尔结果。
如果所有行得到真(包括子查询没有返回任何行的情况),ALL的结果就是“真”。
如果没有存在任何假值结果,那么结果是“假”。
如果比较为任何行都不返回假并且对至少一行返回 NULL,则结果为 NULL。
NOT IN等价于<> ALL。
6、 单一行比较
row_constructor operator (subquery)
左手边是一个行构造器。
右手边是一个圆括弧括起来的子查询,
该查询必须返回和左手边行中表达式数目完全一样的列。
另外,该子查询不能返回超过一行的数量(如果它返回零行,那么结果就是空值)。
左手边被计算并逐行与右手边的子查询结果行比较。