数据库作业8:SQL练习5 - SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

本文详细介绍了SQL中的EXISTS谓词及其与NOT EXISTS的使用,包括存在量词的概念和逻辑真值判断。通过实例解析了如何用EXISTS和NOT EXISTS替换其他类型的查询,如全称量词和逻辑蕴涵。此外,还讨论了集合查询的三种操作(并、交、差),并给出了MySQL中相应操作的替代方法。同时,文章讲解了基于派生表的查询,以及SELECT语句的总结,涵盖单表查询、连接查询、嵌套查询和集合查询的各个方面。
摘要由CSDN通过智能技术生成
  • SELECT:【例3.60】~【例3.68】;EXISTS 的使用总结。
  • 基于派生表的查询:改写3.57 ,改写3.60;两种方法对比。
  • SELECT 总结

带有EXISTS谓词的子查询
EXISTS谓词
▫️存在量词
▫️带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

  • 若内层查询结果非空,则外层的WHERE子句返回真值
  • 若内层查询结果为空,则外层的WHERE子句返回假值

▫️由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。

NOT EXISTS谓词
▫️若内层查询结果非空,则外层的WHERE子句返回假值
▫️若内层查询结果为空,则外层的WHERE子句返回真值

[例 3.60]查询所有选修了1号课程的学生姓名。
思路分析:
1、本查询涉及StudentSC关系
2、在Student中依次取每个元组的Sno值,用此值去检查SC
3、若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ‘1’,则取此Student.Sname送入结果表

SELECT Sname
FROM Student
WHERE EXISTS(SELECT *
             FROM SC
             WHERE Sno=Student.Sno AND Cno='1');

在这里插入图片描述
[例 3.61] 查询没有选修1号课程的学生姓名。

SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
                 FROM SC
                 WHERE Sno=Student.Sno AND Cno='1');

在这里插入图片描述
🔸不同形式的查询间的替换

  • 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换
  • 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换

[例 3.55]查询与“刘晨”在同一个系学习的学生。
可以用带EXISTS谓词的子查询替换:

SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS(SELECT *
             FROM Student S2
             WHERE S2.Sdept=S1.Sdept AND S2.Sname='刘晨');

在这里插入图片描述
在这里插入图片描述
❗️❗️❗️**用EXISTS/NOT EXISTS实现全称量词(难点)**❗️❗️❗️
SQL语言中没有全称量词 ∀(For all)
可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
(∀x)P≡¬(∃x(¬P))
[例 3.62] 查询选修了全部课程的学生姓名。

SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
                 FROM Course
                 WHERE NOT EXISTS(SELECT *
                                  FROM SC
                                  WHERE Sno=Student.Sno 
                                  AND Cno=Course.Cno
                                )
               );

转义后的表达:没有一门课程是他不选修的
❗️❗️❗️**用EXISTS/NOT EXISTS实现逻辑蕴涵(难点)**❗️❗️❗️
◾️SQL语言中没有蕴涵逻辑运算
◾️可以利用谓词演算将逻辑蕴涵谓词等价转换为:
p →q ≡→¬p∨q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值