SQL中EXISTS/NOT EXISTS的用法
student/course
SCORE/TEACHER
例1:查询所有选修了3-245号课程的学生姓名
有以下四种写法:
1.exists写法
首先取Student表中的一个元组,然后在SCORE表中依次找SCORE.Sno=该元组的Sno,并且对应的Cno='3-245',如果存在,则外层查询的where子句返回为真,则Student表中的该元组可以输出。然后依次遍历Student表中的其他元组。
select SNAME FROM STUDENT where EXISTS(select * from SCORE where STUDENT.SNO = SCORE.SNO and SCORE.CNO = '3-245')
2. join on写法
select SNAME from STUDENT JOIN SCORE on STUDENT.SNO = SCORE.SNO and SCORE.cno = '3-245'
3.in写法
SELECT SNAME from STUDENT WHERE sno in (select sno from SCORE WHERE SNO = STUDENT.SNO and CNO = '3-245')
4.引用两个表
SELECT SNAME from STUDENT,SCORE WHERE STUDENT.SNO = SCORE.SNO and SCORE.CNO = '3-245'
结果都是:
例2:查询没有选修3-245号课程的学生姓名
select SNAME FROM STUDENT where NOT EXISTS(select * from SCORE where STUDENT.SNO = SCORE.SNO and SCORE.CNO = '3-245')
例3:查询选修了全部课程的学生姓名
查找语义:查询这样的学生,没有一门课程是他不选修的。
查找过程:
首先,选取Student表中的一个元组,然后在依次判断Course表中的每个元组是否可以输出,只要有一个课程可以输出,则最外层查询的where子句返回为false;而在判断某个课程是否可以输出时,则要利用第三层查询,利用当前的学号和当前的课程号,在SC表中查询,如果存在,则第二层查询where子句返回false。至此,每一门课程都不可以输出时,这个学号对应的元组才可以输出。表示这个学生选修了全部的课程。
select Sname from STUDENT where not exists ( select * from COURSE where not exists ( select * from SCORE where SNO=STUDENT.SNO AND CNO=COURSE.CNO ) )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!