数据库作业7:SQL练习4 - SELECT(连接查询、嵌套查询)

本文提供了多个SQL查询示例,包括连接查询(如内连接、外连接)和嵌套查询的应用。例如,查询每个学生及其选修课程情况、查找间接先修课程、筛选成绩优秀学生、查询与特定学生同一系的学生以及找出超过个人选修课程平均成绩的学生等。通过这些例子,读者可以深入理解SQL中的复杂查询操作。

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

[例 3.49] 查询每个学生及其选修课程的情况
SELECT Student., SC.
FROM Student, SC
WHERE Student.Sno = SC.Sno;
通过学生的学号将Student表与SC表连接起来。

[例 3.50] 对[例 3.49]用自然连接完成
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
省去了一列学号,表确实美观了许多。

[例 3.51 ]查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND
SC.Cno=’ 2 ’ AND SC.Grade>90;
在SC中找Cno=2和Grade>90组成个关系再连接Student中满足关系的元组。

[例 3.52]查询每一门课的间接先修课
SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
表里面有3号课,它的对应先行课是2号课,2号的先行课为1号课,则1号就是3号的间接先行课。

[例 3. 53] 改写[例 3.49]
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
内容为空的数据显示出来了,这是因为外连接的关系。

[例3.54]查询每个学生的学号、姓名、选修的课程名及成绩

SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course /多表连接/
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;
老生常谈,没有异常。

[例 3.55] 查询与“刘晨”在同一个系学习的学生。
1、SELECT Sdept
FROM Student
WHERE Sname= ’ 刘晨 ';
2、SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept= ’ CS ';
将第一步嵌入到第二步查询的条件中:
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ’ 刘晨 ');

[例 3.56]查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname= ‘信息系统’
)
);
1、Course表中找到信息系统的课程号;
2、在SC表中找到选了3的学生学号;
3、在Student表中找到对应的学生学号和姓名。

[例 3.57 ]找出每个学生超过他选修课程平均成绩的课程号。

SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
带有ANY(SOME)或ALL谓词的子查询
使用ANY或ALL谓词时必须同时使用比较运算
语义为:

ANY 大于子查询结果中的某个值
ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
= ANY 大于等于子查询结果中的某个值
= ALL 大于等于子查询结果中的所有值

[例 3.58] 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄

SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= ’ CS ')
AND Sdept <> ‘CS ’ ; /*注意这是父查询块中的条件 */

[例 3.59] 查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
两种方法:
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ’ CS ')
AND Sdept <> ’ CS ’;

SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ’ CS ‘)
AND Sdept <>’ CS ';
分别是使用了ALL谓词和聚集函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值