数据库作业8

本文介绍了数据库查询中的SELECT语句使用,重点讲解了带EXISTS谓词的子查询,集合查询(UNION、INTERSECT、EXCEPT)以及基于派生表的查询。通过实例解析了如何查询选修特定课程的学生、进行集合操作以及如何在FROM子句中使用子查询来创建派生表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

一、 带有EXISTS谓词的子查询

EXISTS谓词代表存在量词 ∃
带有EXISTS谓词的子查询不返回任何数据,只产生 逻辑真值“true” 或 逻辑假值“false”
若内层查询结果非空,则外层的 WHERE子句返回真值
若内层查询结果为空,则外层的 WHERE子句返回假值
一些带EXISTS 或 NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换

【例3.60】查询所有选修了1号课程的学生姓名。

SELECT Sname
FROM   Student
WHERE  EXISTS
            ( SELECT *
              FROM   SC
              WHERE  Sno = Student.Sno AND Cno = '1');
--用连接查询也可以达到目标
--SELECT Sname
--FROM Student
--WHERE EXISTS
           --( SELECT *
              --FROM   SC
              --WHERE  Sno = Student.Sno AND Cno = '1');

在这里插入图片描述
这里的exists谓词是用来连接where语句与内层查询的,把内层结果逐个e一遍。
连接查询能表达的它都能表达,但是它能表达的连接查询并不一定能表达。

【例3.61】查询没有选修1号课程的学生姓名。

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

EXISTS前加个NOT ,就是NOT EXISTS谓词,这个谓词产生的值与EXISTS是相反的。
在这里插入图片描述
也就是除了选一号课程的学生,Student表中其他元组都是产生正值然后被输出。

【例3.55】查询与“刘晨”在同一个系学习的学生。(不排除刘晨自己)

方法一:exists嵌套查询

SELECT Sno, Sname, Sdept
FROM   Student S1
WHERE  EXISTS
           ( SELECT *
              FROM   Student S2
              WHERE  S2.Sdept = S1.Sdept AND S2.Sname = '刘晨'); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值