SQL中EXISTS的使用

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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值