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 existsselect 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 existsselect 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 existsselect 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

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

SqlServer中Exists的使用相关推荐

  1. 数据库:SQLServer中in和 exists函数用法笔记

    今天给大家分享一下SQLServer中in和 exists 用法,希望能对大家有所帮助. 一.IN 用法 确定指定的值是否与子查询或列表中的数据相匹配. 1.1 语法格式 test_expressio ...

  2. Sqlserver中一直在用又经常被忽略的知识点一

    已经有快2个月没有更新博客了,实在是因为最近发生了太多的事情,辞了工作,在湘雅医院待了一个多月,然后又新换了工作...... 在平时的工作中,Sqlserver中许多知识点是经常用到的,但是有时候我们 ...

  3. 关于T-SQL中exists或者not exists子查询的“伪优化”的做法

    问题起源 在使用t-sql中的exists(或者not exists)子查询的时候,不知道什么时候开始,发现一小部分人存在一种"伪优化"的一些做法, 并且向不明真相的群众传递这一种 ...

  4. SQLServer中一个多用户自动生成编号的过程

    SQLServer中一个多用户自动生成编号的过程 if not exists (select * from dbo.sysobjects where id = object_id(N'[IndexTa ...

  5. 从SQLserver中导出表数据到Access

    每篇随便都得有个背景吧,这次做一个项目时,突然碰到这个样一个问题,需要将本地sqlserver中的数据导出到access后,再传输access数据库,所以就在想怎样实现这样的操作.后面经过在网上查找了 ...

  6. 简单介绍SQLserver中的declare变量用法

    这篇文章主要介绍了SQLserver中的declare变量用法,sql中declare是声明的意思,就是声明变量的,这个一般是用在函数和存储过程中的.感兴趣的可以来了解一下 平时写SQL查询.存储过程 ...

  7. java mysql in_MySQL中Exists和In的使用

    Exists关键字: exists表示存在,是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避 ...

  8. sqlserver中能用when_sqlserver中if语句顶替when.case.语句

    sqlserver中if语句替代when...case..语句 create table Employees ( EmployeeID char(6) primary key not null, Na ...

  9. 相关子查询中exists后select 加数字的理解

      查看文章     相关子查询中exists后select 加数字的理解 2010-07-23 17:16 前提:两个基础表 SQL> select * from courses; COURS ...

最新文章

  1. 基于 Spring Cloud 开发的分布式系统,遇到爬虫、接口盗刷怎么办?
  2. matlab破损皮革定位,皮革下料
  3. 前后端分离开发模式下后端质量的保证 —— 单元测试
  4. comsol显示电场计算结果_在 COMSOL 中构建磁流体动力学多物理场模型
  5. 认识与入门 Markdown
  6. java获取当前行数
  7. 高质量病毒——暴风一号(BoyFine)代码.vbs
  8. 【测试能力提升】Jira 和禅道数据库分析,方便你写周报、写总结、出报告
  9. iOS开发常用三方库、插件、知名博客等等
  10. python实现isprime函数_Python语言的isPrime函数 - python
  11. 【人工智能】2.博弈问题、博弈搜索策略
  12. 【USACO10HOL】 Cow Politics
  13. Android scheme链接打开本地应用
  14. python中双等号与单等号的区别_双等号 == 与单等号 =
  15. EasyNVR服务里为什么会有两个easynvr程序?可以互相替换吗?
  16. Spring Boot 9 :详细描述Spring Boot + Vue项目部署过程:Centos为例(重点)
  17. CF1169C. Increasing by Modulo(二分)
  18. 项目章程和项目管理计划
  19. 2017测试之路怎么走?
  20. TCP标志位 RST作用、原理、攻击

热门文章

  1. 大学生自我鉴定 范文2
  2. 手动启动ipython
  3. java设计模式之——外观模式、组合模式、装饰模式、享元模式(结构型)
  4. 如何在工作中保持稳定的情绪?——打工人必看!
  5. 牛顿法的简单介绍及Matlab实现
  6. 外文文献|电子商务网站的设计与实现
  7. 【JS基础】求整数1~100的累加值,但要求跳过所有个位为3的数
  8. linux命令hexdump,Linux中hexdump命令的使用
  9. mfsocket怎样彻底删除_告别无法彻底卸载AutoCAD的烦恼
  10. 【算法入门09】矩形覆盖