SQL中EXISTS的使用
2024-08-24 12:27:10
1.简介
- 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
- 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询
- EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”
2.表结构
选课表:学号、课程号
学生表:学号、姓名
课程表:课程号、课程名
3.查询所有选修了“C1”课程的学生名。
普通SQL查询:
SELECT 姓名
FROM 学生表
WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1');
带EXISTS的SQL查询:
SELECT 姓名
FROM 学生表
WHERE EXISTS
(
SELECT *
FROM 选课表
WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1'
);
相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。
EXISTS语句不关心子查询的具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。
- Exists:若子查询的结果集非空时,返回“True”;若子查询的结果集为空时,返回“False” 。
- NOT EXISTS :若子查询结果为空,返回“TRUE”值;若子查询的结果集非空时,返回 “FALSE。
4.查询没有选C1课程的学生的学号、姓名
SELECT 姓名
FROM 学生表
WHERE NOT EXISTS
(
SELECT *
FROM 选课表
WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1'
);
5.查询选修了所有课程的学生的姓名(续)
SELECT 姓名
FROM 学生表
WHERE NOT EXISTS
(
SELECT *
FROM 课程表
WHERE NOT EXISTS
(
SELECT *
FROM 选课表
WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号
)
);
6.查询至少选修了S1所选的全部课程的学生名
SELECT 姓名
FROM 学生表
WHERE NOT EXISTS
(
SELECT *
FROM 选课表 AS 选课表X
WHERE 选课表X.学号='s1' AND NOT EXISTS
(
SELECT *
FROM 选课表 AS 选课表Y
WHERE 学生表.学号 = 选课表Y.学号 AND 选课表X.课程号 = 选课表Y.课程号
)
);
7.在FROM语句中使用子查询,对查询结果定义表名及列名 例:求平均成绩超过80分的学号及平均成绩
SELECT 学号, AVG_G
FROM
(
SELECT 学号, AVG(Grade)
FROM 选课表
GROUP BY 学号
) AS RA(学号, AVG_G)
WHERE AVG_G > 80
最新文章
- ajax 跨域提交数据
- 个人对joomla3.2x和joomla2.5X浅薄看法
- ios llvm and clang build tools
- win7系统cocos2dx 3.4 绑定自定义类到Lua
- poj 1329 Circle Through Three Points(求圆心+输出)
- Ubuntu网络管理
- 【Unity优化】我所理解的IL指令
- Chapter 5:Spectral-Subtractive Algorithms
- Java连接数据库完整代码 查找和插入
- 一些精妙的sql语句收集
- BaseServer的介绍
- Flask從入門到入土(五)——Flask与数据库
- 牛刀小试——记一次帮朋友小幅优化SQL
- java求素数
- Android中的语言和字符串资源
- 使用ML.NET和Azure Function进行机器学习 - 第2部分
- 日志学习系列(一)——Log4net的基础知识学习
- Java中8种常见的排序方法
- 卸载win10内置的onenote
- vuex最简单、最详细的入门文档