SqlServer中Exists的使用

SqlServer中Exists的使用1、简介不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询。带Exists的子查询就是相关子查询 Exists表示存在量词:带有Exists的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”2、表结构选课表:学号StudentNo、课程号CourseNo学生表:学号Stude…

大家好,又见面了,我是你们的朋友全栈君。

1、简介

  • 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询
  • 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询。带Exists的子查询就是相关子查询
  • Exists表示存在量词:带有Exists的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”

2、表结构

选课表:学号StudentNo、课程号CourseNo

学生表:学号StudentNo、姓名StudentName

课程表:课程号CourseNo、课程名CourseName

3、查询所有选修了“C1”课程的学生名

In语句查询:

select StudentName from 学生表
where StudentNo in (select StudentNo from 选课表 where CourseNo=‘C1’)

Exists查询:

select StudentName from 学生表
where exists (select 1 from 选课表 where 选课表.StudentNo=学生表.StudentNo and 选课表.CourseNo='C1')

相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,利用该记录的相关属性值(在exists子查询的where子句中用到的列)处理内层查询,若外层的where子句返回“true”,则本条记录放入结果表中。然后再取下一行记录,重复上述过程直到外层表遍历完毕。

Exists语句不关心子查询返回的具体内容,因此用“exists(select 1 from)”来判断子查询是否返回记录。

  • Exists(select):若子查询的结果集非空时,exists()表达式返回true;子查询的结果集为空时,exists()表达式返回false。
  • Not Exists(select):若子查询的结果集非空时,not exists()表达式返回false;子查询的结果集为空时,not exists()表达式返回true。

4、查询没所有选修“C1”课程的学生名

select StudentName from 学生表
where not exists (select 1 from 选课表 where 学生表.StudentNo=选课表.StudentNo and CourseNo=‘C1’)

5、查询选修了所有课程的学生名

--外层查询、外层not exists
select StudentName from 学生表 where not exists 
(    
    --内层查询、内层not exists
    select 1 from 课程表 where not exists
    (
        select 1 from 选课表 where 学生表.StudentNo=选课表.StudentNo and 课程表.CourseNo=选课表.CourseNo
    )
)

a、选一行学生信息S1、选一行课程信息C1
内层的not exists()值为true,说明选课表中找不到“S1.StudentNo + C1.CourseNo”这一记录,说明学生S1没有选课程C1,此时内层查询的返回结果集会加上C1,当内层查询的返回结果集不为空时,外层not exists()值为false,则外层where子句值为false,则S1被排除。
当内层查询的返回结果集不为空时,说明S1至少有一门课程没选 。

b、选一行学生信息S1、选一行课程信息C2
内层的not exists()值为false,说明选课表中有“S1.StudentNo + C2.CourseNo”这一记录,说明学生S1选了课程C2,此时内层查询的返回结果集不会加上C2,当内层查询的返回结果集为空时,外层not exists()值为true,则外层where子句值为true,则S1被选中。
当内层查询的返回结果集为空时,说明S1已经选了所有课程。 

c、结果
外层查询最终返回的结果是选择了所有课程的学生。

6、查询选修了C1课程和C2课程的学生名

--外层查询、外层not exists
select StudentName from 学生表 where not exists 
(    
    --内层查询、内层not exists
    select 1 from 课程表 where CourseNo in('C1','C2') and not exists
    (
        select 1 from 选课表 where 学生表.StudentNo=选课表.StudentNo and 课程表.CourseNo=选课表.CourseNo
    )
)

第五条查询的是选修了所有课程的学生,如果我们将所有课程限定为“C1、C2”,那查询结果就变为选修了C1、C2的学生,该结果保证学生至少选修了C1、C2,但是选没选其他课不清楚。

7、查询至少选修了S1所选的全部课程的学生名

--外层查询、外层not exists
select StudentName from 学生表 where not exists 
(    
    --内层查询、内层not exists
    select 1 from 选课表X where 选课表X.StudentNo='S1' and not exists
    (
        select 1 from 选课表Y where 学生表.StudentNo=选课表Y.StudentNo and 选课表X.CourseNo=选课表Y.CourseNo
    )
)

第五条查询的是选修了所有课程的学生,如果我们将所有课程限定为S1所选的全部课程,那查询结果就变为选修了S1所选的全部课程的学生,该结果保证学生至少选修了S1所选的全部课程,但是选没选其他课不清楚。

8、在from语句中使用子查询,对查询结果定义表名及列名

--定义表名可以用as也可以不用as
select StudentName,avgScore,CreateDate from
(select StudentName,CreateDate,AVG(Score) from StudentScores group by StudentName,CreateDate)as ta(StudentName,avgScore,CreateDate)
where CreateDate>80

--定义表名可以用as也可以不用as
select StudentName,avgScore,CreateDate from
(select StudentName,CreateDate,AVG(Score) from StudentScores group by StudentName,CreateDate)ta(StudentName,avgScore,CreateDate)
where CreateDate>80

SqlServer中Exists的使用

最后,我要感谢http://www.cnblogs.com/jiangyunfeng/p/9054305.html的无私奉献!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159253.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • convert dynamic命令在win10不可用_对目标文件系统,文件win7.gho过大

    convert dynamic命令在win10不可用_对目标文件系统,文件win7.gho过大全平台通过Termius,你可以安卓、Windows、macOS、Linux下来连接你的服务器,并且会在不同设备间同步,电脑做着做着要离开,换手机接着做官网链接:界面UI非常细腻win上面有xsheel,个人感觉xsheel更加强大。但是他不做Mac版本。由于在Mac上面用过Termius,所以习惯了他的界面。想要在win上面也用Termius汉化:手动方式打开当前这个js文件目录下面的这个js文件。然后全局搜索进行修改,但是一个一个改感觉麻烦创建一个termius.ini的文件,把下面这些复制进去

    2025年7月21日
    3
  • django 自定义user_tb程序化交易模型源码

    django 自定义user_tb程序化交易模型源码前言Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了。它的完整的路径是在django.contrib.auth.models.User。User模型源码分析

    2022年7月29日
    9
  • Android Binder机制(超级详尽)

    1.binder通信概述   binder通信是一种client-server的通信结构,   1.从表面上来看,是client通过获得一个server的代理接口,对server进行直接调用;   2.实际上,代理接口中定义的方法与server中定义的方法是一一对应的;   3.client调用某个代理接口中的方法时,代理接口的方法会将client传递的参数打包成为Pa

    2022年4月6日
    47
  • FQDN_dns资源记录类型有哪些

    FQDN_dns资源记录类型有哪些FQDN全域名(FQDN,FullyQualifiedDomainName)是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置。例如,acmecompany公司的Web服务器的全域名可以是[url]www.acmecom…

    2025年8月16日
    1
  • RabbitMQ 延迟队列实现订单支付结果异步阶梯性通知[通俗易懂]

    RabbitMQ 延迟队列实现订单支付结果异步阶梯性通知[通俗易懂]在第三方支付中,例如支付宝、或者微信,对于订单请求,第三方支付系统采用的是消息同步返回、异步通知+主动补偿查询的补偿机制。 由于互联网通信的不可靠性,例如双方网络、服务器、应用等因素的影响,不管是同步返回、异步通知、主动查询报文都可能出现超时无响应、报文丢失等情况,所以像支付业务,对结果的通知一般采用几种方案结合的补偿机制,不能完全依赖某一种机制。例如一个支付结果的通知,一方面会在支付页…

    2022年5月13日
    46
  • 数据库分区分表和提升性能「建议收藏」

    数据库分区分表和提升性能「建议收藏」http://my.oschina.NET/tinyframework/blog/186583序言一直在做企业应用,目前要做一些互联网应用,当然只是应用是放在互联网的,数据量距离真正的互联网应用还是有相当大的差距的。但是不可避免的,在数据库出现瓶颈的情况还是有的,现在做互联网上的应用,当然也要未雨绸缪,要考虑数据量大的时候的解决方案。这个目前开源的商用的也都有不少解

    2022年5月18日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号