设为首页 收藏本站
查看: 783|回复: 0

[经验分享] MS-SQL子查询大全

[复制链接]

尚未签到

发表于 2018-10-16 10:32:49 | 显示全部楼层 |阅读模式
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 构造的结果将是 NULL,而不是假。 这个行为是遵照 SQL 处理布尔和 NULL 值组合时的规则定的。
  和 EXISTS 一样,假设子查询将被完成运行完全是不明智的。 row_constructor IN (subquery) 这种形式的 IN 的左手边是一个行构造器,右手边是一个圆括弧括起来的子查询,它必须返回和左手边返回的行中表达式所构成的完全一样多的字段。左手边表达式就子查询结果的每一行进行计算很比较。如果找到任意相等的子查询行,则 IN 的结果为"真"。如果没有找到相等行,那么结果为"假"(包括子查询不返回行的特殊例子)。 通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。如果两个行对应的成员都是非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等;否则这样的行比较的结果是未知(NULL)。如果所有行的结果要么是不等, 要么是 NULL,并且至少有一个 NULL,那么 IN 的结果是 NULL。
  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/SOMEexpression operator ANY (subquery)
  expression operator SOME (subquery)
  这种形式的 ANY 右手边是一个圆括弧括起来的子查询, 它必须返回一个字段。左手边表达式将使用给出的 operator对子查询的结果的每一行进行一次计算和比较。目前如果获得任何真值结果,那么 ANY 的结果就是"真"。如果没有找到真值结果,那么结果是"假"(包括子查询没有返回任何行的特殊例子)。 SOME 是 ANY 的同意词。 IN 等效于 = ANY。
  请注意如果没有任何成功并且至少有一个右手边行为该操作符结果生成 NULL, 那么 ANY 构造的结果将是NULL,而不是 FALSE。 这个行为是遵照 SQL 处理布尔和 NULL 值组合时的规则定的。
  和 EXISTS 一样,假设子查询将被完成运行完全是不明智的。 row_constructor operator ANY (subquery)
  row_constructor operator SOME (subquery)
  这种形式的左手边是一个行构造器,右手边是一个圆括弧括起来的子查询,它必须返回和左手边列表给出的表达式一样多的列。左手边表达式将使用给出的 operator对子查询的结果的每一行进行一次计算和比较。目前,系统只允许使用 = 或  操作符处理逐行的 ANY 构造。 如果分别找到相等或者不相等的行,那么 ANY 的结果就是 "真"。如果没有找到这样的行,那么结果是"假"(包括子查询没有返回任何行的特殊例子)。
  通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。如果两个行对应的成员都是非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等;否则这样的行比较的结果是未知(NULL)。如果至少有一个 NULL 行结果, 那么 ANY 的结果将是TRUE 或者 NULL。
  5.ALL expression operator ALL(subquery)
  ALL 的这种形式的右手边是一个圆括弧括起来的子查询, 它必须只返回一列。左手边表达式将使用给出的 operator对子查询的结果的每一行进行一次计算和比较。该操作符必须生成布尔结果.如果所有行的结果都为"真",(包括子查询没有返回任何行的特殊例子)。 那么 ALL 的结果就是"真"。如果没有存在任何假值结果,那么结果是"假"。
  NOT IN 等效于  ALL。
  请注意如果没有运算失败但是至少有一个右手边行为该操作符的结果生成 NULL 值, 那么 ALL 构造的结果将是 NULL,而不是 TRUE。 这个行为是遵照 SQL 处理布尔和 NULL 值组合时的一般规则定的。
  和 EXISTS 一样,假设子查询将被完成运行完全是不明智的。
  row_constructor operator ALL (subquery)
  ALL 的这种形式的左手边是一个行构造器,右手边是一个圆括弧括起来的子查询,它必须返回和左手边行给出的表达式一样多的字段。左手边表达式将使用给出的 operator对子查询的结果的每一行进行一次计算和比较。 目前系统只允许使用 = 和  操作符处理逐行的 ALL 查询。 如果所有子查询都是相等或者不相等的行,那么 ALL 的结果就是"真"。(包括子查询没有返回任何行的特殊例子)。 如果分别有任何不相等或者相等的行,那么结果是"假"。
  通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。如果两个行对应的成员都是非空并且相等,那么认为这两行 相等;如果任意对应成员为非空且不等,那么该两行不等;否则这样的行比较的结果是未知(NULL)。如果至少有一个 NULL 行结果, 那么 ALL 的结果就不可能是TRUE;它将会是 FALSE或者 NULL。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-622240-1-1.html 上篇帖子: SQL Server发送HTML格式邮件(事务) 下篇帖子: SQL中truncate、delete与drop区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表