MS-SQL的子查询表达式(1)
  4O6ij6juJZ7u 2023年11月02日 43 0


MS-SQL的子查询表达式

1.EXISTS         EXISTS ( subquery

    EXISTS 的参数是一个任意的SELECT语句, 或者说子查询。系统对子查询进行运算以判断它是否返回行。 如果它至少返回一行,那么 EXISTS 的结果就为"真"; 如果子查询没有返回行,那么 EXISTS 的结果是"假"。

         子查询可以引用来自周围的查询的变量,这些变量在该子查询的任何一次计算中都起常量的作用。

         这个子查询通常只是运行到能判断它是否可以生成至少一行为止, 而不是等到全部结束。在这里写任何有副作用的子查询都是不明智的(比如调用序列函数);这些副作用是否发生是很难判断的。

EXISTS测试 EXISTS(SELECT 1 WHERE ...)。不过这条规则有例外, 比如那些使用 INTERSECT

col2上的一次内联接,但是它为每个 tab1的行生成最多一个输出,即使存在多个匹配tab2的行也如此∶


SELECT col1 from tab1 WHERE EXISTS(SELECT 1 from tab2 WHERE col2 = tab1.col2);


2.IN expression IN (subquery)


IN 的这种形式的右手边是一个圆括弧括起来的子查询, 它必须只返回一个字段。左手边表达式对子查询的结果

的每一行进行一次计算和比较。 如果找到任何等于子查询行的情况,那么 IN 的结果就是"真"。 如果没有找到相等

行,那么结果是"假"(包括子查询没有返回任何行的特殊例子)。

请注意如果左手边表达式生成 NULL,或者没有相等的右手边数值, 并且至少有一个右手边行生成 NULL,那么

IN

EXISTS

row_constructor IN (subquery)

IN

中表达式所构成的完全一样多的字段。 左手边表达式就子查询结果的每一行进行计算很比较。如果找到任意相等的子

查询行,则 IN 的结果为"真"。如果没有找到相等行, 那么结果为"假"(包括子查询不返回行的特殊例子)。

通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。 如果两个行对应的成员都是

非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等; 否则这样的行比较的结果

是未知(NULL)。如果所有行的结果要么是不等, 要么是 NULL,并且至少有一个 NULL,那么 IN

3.NOT IN expression NOT IN (subquery)

右手边是一个用圆括弧包围的子查询,它必须返回一个字段。左手边表达式就子查询结果的每一行进行计算和比较。

如果只找到不相等的子查询行(包括子查询不返回行的特殊情况),那么NOT IN 的结果是"真"。 如果找到任何相等行,

则结果为"假"。

NOT IN

构造的结果将是空,而不是真。这是根据 SQL 对布尔和空值组合的一般规则制定的。

EXISTS

row_constructor NOT IN (subquery)

NOT IN

回的行一样多的字段。 左手边表达式对子查询的结果的每一行进行一次计算和比较。 如果只出现不等于子查询行的情

况,那么 NOT IN 的结果就是"真"。 (包括子查询没有返回任何行的特殊例子)。如果找到相等行,那么结果是"假"。

和通常一样,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。 如果两个行对应

的成员都是非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等; 否则这样的行比

较的结果是未知(NULL)。如果所有行的结果要么是不等, 要么是 NULL,并且至少有一个 NULL,那么 NOT IN

果是 NULL。

4.ANY/SOME

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

ANY

operator对子查询的结果的每一行进行一次计算和比较。目前如果获得任何真值结果,那么 ANY 的结果就是"真"。

如果没有找到真值结果,那么结果是"假"(包括子查询没有返回任何行的特殊例子)。

SOME 是 ANY 的同意词。 IN 等效于 = ANY。

ANY

NULL,而不是 FALSE。 这个行为是遵照 SQL 处理布尔和 NULL 值组合时的规则定的。

EXISTS

row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)

这种形式的左手边是一个行构造器,右手边是一个圆括弧括起来的子查询, 它必须返回和左手边列表给出的

表达式一样多的列。左手边表达式将使用给出的 operator对子查询的结果的每一行进行一次计算和比较。 目前,

系统只允许使用 = 或 <> 操作符处理逐行的 ANY 构造。 如果分别找到相等或者不相等的行,那么 ANY

就是 "真"。如果没有找到这样的行,那么结果是"假"(包括子查询没有返回任何行的特殊例子)。

通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。 如果两个行对应的

成员都是非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等; 否则这样的行

比较的结果是未知(NULL)。如果至少有一个 NULL 行结果, 那么 ANY

5.ALL expression operator ALL(subquery)

ALL

operator对子查询的结果的每一行进行一次计算和比较。该操作符必须生成布尔结果.如果所有行的结果都为"真",

(包括子查询没有返回任何行的特殊例子)。 那么 ALL 的结果就是"真"。如果没有存在任何假值结果,那么结果是

"假"。

NOT IN 等效于 <> ALL。

ALL

是 NULL,而不是 TRUE。 这个行为是遵照 SQL 处理布尔和 NULL 值组合时的一般规则定的。

EXISTS

row_constructor operator ALL (subquery)

ALL

的表达式一样多的字段。 左手边表达式将使用给出的 operator对子查询的结果的每一行进行一次计算和比较。 目

前系统只允许使用 = 和 <> 操作符处理逐行的 ALL 查询。 如果所有子查询都是相等或者不相等的行,那么 ALL

的结果就是"真"。(包括子查询没有返回任何行的特殊例子)。 如果分别有任何不相等或者相等的行,那么结果是

"假"。

通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则 进行组合的。如果两个行对应的

成员都是非空并且相等,那么认为这两行 相等;如果任意对应成员为非空且不等,那么该两行不等; 否则这样的行

比较的结果是未知(NULL)。如果至少有一个 NULL 行结果, 那么 ALL

或者 NULL。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

4O6ij6juJZ7u
最新推荐 更多

2024-05-31