携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
数据库原理-数据查询 嵌套查询【一】
嵌套查询概述
- 一个SELECT-FROM-WHERE语句称为一个查询块
- 将一个查询块嵌套这另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
SELECT Sname
FROM Student
WHERE Sno IN (SELECT Sno
FROM SC
WHERE Cno='2');
- 上层的查询块称为外层查询或父查询
- 下层的查询块称为内层查询或子查询
- SQL语言允许多层嵌套查询
- 子查询的限制
- 不能使用ORDER BY 子句
不相关子查询
子查询的查询条件不依赖于父查询
- 由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件
相关子查询:子查询的查询条件依赖于父查询
- 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
- 然后再取外层表的下一个元组
- 重复这一过程,直至外层表全部检查完为止
带有IN谓词的子查询
查询与“刘晨”在同一个系学习的学生
此查询要求可以分步骤来完成
1 确定“刘晨”所在系名
SELECT Sdept
FROM Student
WHERE Sname="刘晨"
结果为:CS
2 查找所有在CS系学习的学生
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept='CS';
合并
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨')
用自身连接完成查询要求
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname = '刘晨';
查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Con IN
(SELECT Cno
FROM Course
WHERE Cname='信息系统'
)
);
1 首先在Course关系中找出“信息系统”的课程号,为3号
2 然后这SC关系中找出选修了3号课程的学生学号
3 最后在Student关系中取出Sno和Sname
用连接查询实现
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname='信息系统';
带有比较运算符的子查询
当前确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或<>)
SELECT Sdept
FROM Student
WHERE Sname="刘晨";
找出每个学生超过他选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC X
WHERE Grade >= (SELECT AVG (Grade))
FROM SC y
WHERE y.Sno = x.Sno);
可能的执行过程
-
从外层查询中取出SC的一个元组x,将元组x的Sno值(201215121)传送给内层查询
SELECT AVG(Grade) FROM SC y WHERE y.Sno = '201215121'; -
执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询:
SELECT Sno,Cno FROM SC x WHERE Grade >= 88; -
执行该查询,得到结果:
-
然后外层查询取下一个元组重复上述步骤,直到外层的SC元组全部处理完毕