SQL-不相关子查询

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WHERE Sname= ‘刘晨’)
Student(sno,sname,sage,sdept) Course(cno,cname,ccredit) SC(sno,cno,grade)
构造嵌套查询
Student(sno,sname,sage,sdept) Course(cno,cname,ccredit) SC(sno,cno,grade)
一、带有IN谓词的子查询
[例] 查询与“刘晨”在同一个系学习的学生学号,姓名,系 别。此查询要求可以分步来完成
① 确定“刘晨”所在系名
SELECT Sdept FROM Student
WHERE Sname= ' 刘晨 ';
假设查询结果为:{ ‘IS’ } ② 查找所有在IS系学习的学生学号,姓名,系别。
SELECT Sname
由里向外逐层处理。
FROM Student
每个子查询在上一级查询处理 之前求解,子查询的结果用于 建立其父查询的查找条件。
WHERE Sno IN (SELECT Sno
FROM SC WHERE Cno= ' 2 ');
引出不相关子查询的谓词
❖ 带有IN谓词的子查询 ❖ 带有比较运算符的子查询 ❖ 带有ANY或ALL谓词的子查询
● 当能确切知道内层查询返回单值时,可用比较运算符(>,<, =,>=,<=,!=或< >)。
构造嵌套查询
❖ 查询与“刘晨”在同一个系学习的学生学号,姓名,系别 ❖ 思考:可否将该嵌套查询改为连接查询? ❖ 用自身连接完成本查询要求
SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept = S2.Sdept AND S2.Sname = '刘晨';
❖ 查询与“刘晨”在同一个系学习的学生学号,姓名,系别
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN
② 然后在Student关系中找出在IS
系的课程的学生学号、姓名、系 别
(SELECT Sdept ① 首先在Student关系中找出“刘晨 FROM Student “所在的系,假设结果为IS WHERE Sname= ‘刘晨’)
❖小结: ❖嵌套查询 ❖不相关子查询及注意事项
Student(sno,sname,sage,sdept) Course(cno,cname,ccredit) SC(sno,cno,grade)
[练习]查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname FROM Student WHERE Sno IN
③ 最后在Student关系中取出Sno和sname
外层查询/父查询
WHERE Sno IN
(SELECT Sno FROM SC
内层查询/子查询
WHERE Cno= ' 2 ');
层层嵌套方式反映了 SQL语言的结构化
有些 嵌套查询可以用连接运算替代
Student(sno,sname,sage,sdept) Course(cno,cname,ccredit) SC(sno,cno,grade)
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= ‘ IS ’; Student(sno,sname,sage,sdept)
Course(cno,cname,ccredit) SC(sno,cno,grade)
构造嵌套查询
❖ 查询与“刘晨”在同一个系学习的学生学号,姓名,系别 ❖ 将第一步查询嵌入到第二步查询的条件中
数据库系统
关系数据库标准语言SQL之 不相关子查询
Student表 Sno Sname 学号 姓名 Course表 Cno Cname 课号 课程名 SC表 Sno Cno 学号 课号
பைடு நூலகம்
Sage 年龄
Sdept 系别
CCredit 课程学分
Grade 成绩
嵌套查询
SELECT Sname FROM Student
(SELECT Sno FROM SC WHERE Cno IN
② 然后在SC关系中找出选修了3号课程 的学生学号
(SELECT Cno
① 首先在Course关系中找出“信
FROM Course 息系统”的课程号,假设结果为3号
WHERE Cname= ‘信息系统’) );
Student(sno,sname,sage,sdept) Course(cno,cname,ccredit) SC(sno,cno,grade)
嵌套查询(续)
❖ 嵌套查询概述
▪ 一个SELECT-FROM-WHERE语句称为一个查询块 ▪ 将一个查询块嵌套在另一个查询块的WHERE子句
或HAVING短语的条件中的查询称为嵌套查询
嵌套查询分类
❖ 不相关子查询:子查询的查询条件不依赖于父查询 ❖ 相关子查询:子查询的查询条件依赖于父查询
不相关子查询
SELECT Sno,Sname,Sdept
② 然后在Student关系中找出在IS
FROM Student
系的课程的学生学号、姓名、系
WHERE Sdept IN {‘IS’ }别
(SELECT Sdept ① 首先在Student关系中找出“刘晨 FROM Student “所在的系,假设结果为IS
相关文档
最新文档