SqlServer中Exists的使用小结

 更新时间:2024年02月27日 09:49:17   作者:changuncle  
在SQLServer中,EXISTS是一种逻辑运算符,用于检查一个子查询是否返回结果,本文主要介绍了SqlServer中Exists的使用小结,具有一定的参考价值,感兴趣的可以了解一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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的使用小结的文章就介绍到这了,更多相关SqlServer Exists内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家! 

相关文章

  • 分享Sql日期时间格式转换

    分享Sql日期时间格式转换

    这篇文章介绍了Sql日期时间格式转换,有需要的朋友可以参考一下
    2013-08-08
  • Sql Server数据库实现表中字段的列加密

    Sql Server数据库实现表中字段的列加密

    本文主要介绍了Sql Server数据库实现表中字段的列加密,主要包括利用证书对数据进行加密和解密,利用非对称密钥对数据进行加密和解密,利用对称密钥对数据进行加密和解密,感兴趣的可以了解一下
    2023-10-10
  • SQL 将一列拆分成多列的三种方法

    SQL 将一列拆分成多列的三种方法

    这篇文章主要介绍了SQL 将一列拆分成多列的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 使用SQL语句创建数据库与创建表操作指南

    使用SQL语句创建数据库与创建表操作指南

    这篇文章主要给大家介绍了关于使用SQL语句创建数据库与创建表操作的相关资料,创建数据库是数据库管理的第一步,而SQL语句是创建数据库的基本工具,需要的朋友可以参考下
    2023-08-08
  • SQL实现查询某字段的值为空的记录

    SQL实现查询某字段的值为空的记录

    这篇文章主要介绍了SQL实现查询某字段的值为空的记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • sql中varchar和nvarchar的区别与使用方法

    sql中varchar和nvarchar的区别与使用方法

    经常用varchar总发现从access数据库直接转到mssql数据库默认的都是nvarchar和ntext所以,找了一下,原来有这个说法。
    2008-01-01
  • SQL Server查询前N条记录的常用方法小结

    SQL Server查询前N条记录的常用方法小结

    这篇文章主要介绍了SQL Server查询前N条记录的常用方法,以实例形式分析总结了SQL Server查询数据库的三种常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • sql?server卡慢问题定位与排查过程

    sql?server卡慢问题定位与排查过程

    做过运维的朋友们都可能会遇到,服务器应用程序运行慢的问题,下面这篇文章主要给大家介绍了关于sql?server卡慢问题定位与排查过程的相关资料,需要的朋友可以参考下
    2023-03-03
  • SQL?Server?DATEDIFF()?函数用法

    SQL?Server?DATEDIFF()?函数用法

    这篇文章主要介绍了SQL?Server?DATEDIFF()?函数的定义和用法,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • SQL查询连续登陆7天以上的用户的方法实现

    SQL查询连续登陆7天以上的用户的方法实现

    本文主要介绍了SQL查询连续登陆7天以上的用户的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论

?


http://www.vxiaotou.com