数据库作业6——嵌套查询
- 3.4.3 嵌套查询
- 1. 带有in谓词的子查询
- 2. 带有比较运算符的子查询
- 3. 带有any(some)或all谓词的子查询
- 4. 带有exists谓词的子查询
3.4.3 嵌套查询
嵌套查询:将一个查询块嵌套在另一个查询块的where子句或having短句的条件中的查询称为嵌套查询。
分为父查询(外层查询)与子查询(内层查询)
【注】子查询的select语句中不能使用order by 子句
不相关子查询:子查询的查询条件不依赖于父查询(例如 例3.55和例3.56)
相关子查询:子查询的条件依赖于父查询(例如 例3.57)
1. 带有in谓词的子查询
【例3.55】查询与“刘晨”在同一个系学习的学生。
select Sno,Sname,Sdept
from Student
where Sdept in
(select Sdept
from Student
where Sname='刘晨');
它的执行顺序如下列语句:
select Sdept
from Student
where Sname='刘晨';--查询刘晨的系名
select Sno,Sname,Sdept
from Student
where Sdept='CS';--在CS系的学生信息
此外,这个例题也可以通过自身连接来实现:
select S1.Sno,S1.Sname,S1.Sdept
from Student S1,Student S2
where S1.Sdept=S2.Sdept and S2.Sname='刘晨';
例3.55的四种解法:
1.嵌套查询
select Sno,Sname,Sdept
from Student
where Sdept in
(select Sdept
from Student
where Sname='刘晨');2.连接查询
select S1.Sno,S1.Sname,S1.Sdept
from Student S1,Student S2
where S1.Sdept=S2.Sdept and S2.Sname='刘晨';3.带比较运算符的查询
select Sno,Sname,Sdept
from Student
where Sdept=
(select Sdept
from Student
where Sname='刘晨');4.使用exists
select Sno,Sname,Sdept
from Student x
where exists
(select *
from Student y
where y.Sdept=x.Sdept and y.Sname='刘晨');
【例3.56】查询了选修了课程名为“信息系统”的学生学号和姓名。
课程名在Course表中,选课信息在SC表中,学生姓名在Student表中,所以此题涉及三个表。
select Sno,Sname
from Student
where Sno in
(select Sno
from SC
where Cno in
(select Cno
from Course
where Cname='信息系统'));
select * from SC;
用连接查询来做的话:
select Student.Sno,Sname
from Student,Course,SC
where Student.Sno=SC.Sno and
SC.Cno=Course.Cno and
Course.Cname='信息系统';
2. 带有比较运算符的子查询
确切内层查询返回的是单个值时可以用比较运算符。
【例3.57】找出每个学生超过他自己选修课程平均成绩的课程号。
select Sno,Cno
from SC x
where Grade>=
(select avg(Grade)
from SC y
where y.Sno=x.Sno);
我理解的执行过程是:
先在外层查询中取出一个元组,再在内层查询中计算出该元组学生的平均成绩,再在外层查询中依次检查该学生的每门课程的成绩,大于等于平均分就输出;然后继续下一个学生执行相同的步骤。
3. 带有any(some)或all谓词的子查询
any-某一个,任意一个
all-所有的,全部
【例3.58】查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。
任意一个,所以用any
select Sname,Sage
from Student
where Sage<any
(select Sage
from Student
where Sdept='CS')
and Sdept<>'CS';
小于任意一个,相当于小于最大的一个,所以还可以用聚集函数来实现
select Sname,Sage
from Student
where Sage<
(select max(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';
因为CS系年龄最小为18,所有学生的最小年龄也为18,所以输出没有结果,若是查找小于等于最小年龄的,结果如下:
4. 带有exists谓词的子查询
带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
【例3.60】查询所有选修了1号课程的学生姓名。
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);
【例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));
因为没有学生把所有的课都选了,所以就没有截图了。
过程:首先是在Student表中选出第一个元组进入第二层,在第二层中依次选择每个元组在第三层中进行判断,将返回的结果在第二层中做并运算,将运算的结果在返回到第一层中,就结束了对Student表中第一个元组的判断。然后继续判断剩下的元组。
【例3.63】查询至少选修了学生201215122选修夫人全部课程的学生号码
转换语义为:不存在这样的课程y,学生201215122选修了y,而学生x没有选。
select distinct Sno
from SC SCX
where not exists
(select *
from SC SCY
where SCY.Sno='201215122'and not exists
(select *
from SC SCZ
where SCZ.Sno=SCX.Sno and
SCZ.Cno=SCY.Cno));
过程:首先在X中取出一个元组进入第二层,在第二层中选择出学号相同的元组,将每个元组进入第三层判断Z的学号等于X的学号,Z的课程号等于Y的课程号的元组,将逻辑值返回到第二层再进行判断,将所有的返回到第二层的结果进行并运算,最后返回到第一层。之后取X中的下一个值进行相同的操作。
【个人总结】使用exists 还是挺难的,最后两个例题想了很长的时间才稍微理解了语句的含义,但换道题可能又不会了。
数据库作业6——嵌套查询相关推荐
- 数据库实验三 嵌套查询和视图操作
实验三 嵌套查询和视图操作 实验目的: 1. 通过本实验能够熟练应用sql语言使用IN.比较符.ANY或ALL和EXISTS操作符进行嵌套查询操作. 2. 掌握视图的定义.查询.修改. 实验要求: ...
- 数据库作业-sql语句查询
建表的插入数据的表数据库作业-sql建表和插入数据_快乐的xiao何的博客-CSDN博客create table supplier( supplierno char(6) primary key, s ...
- 数据库学习7 — 嵌套查询
章节3.4.3 嵌套查询 1.带有IN谓词的子查询 2.带有比较运算符的子查询 3.带有ANY(SOME)或ALL谓词的子查询 1)比较运算符 2)ANY(或SOME).ALL谓词与聚集函数.IN谓词 ...
- 数据库作业4——数据查询
3.4 数据查询 3.4.1 单表查询 1 选择表中的若干列 (3)查询经过计算的值 2 选择表中的若干元组 (1)消除取值重复的行 (2)查询满足条件的元组 3 ORDER BY 子句 4. 聚集函 ...
- 数据库作业(1.查询姓‘’王‘’的学生个数;2.查询“数学”比“语文”成绩高的所有学生的学号;)
SQL查询姓''王''的学生个数 #一.创建学生.班级.成绩表 #二.打开mysql 1.快捷的win+r,输入cmd,打开命令提示符: 2.连接数据库,在cmd种输入:MySQL -u root - ...
- SQL Server数据库作业:连接查询
目录 一.等值与非等值连接查询 1.等值连接 2.自然连接 二.自身连接 三.外连接 四.多表连接 一.等值与非等值连接查询 1.等值连接 条件Student.Sno=SC.Sno把Student表的 ...
- sql镶嵌查询_【SQL】嵌套查询与子查询
前言 sql的嵌套查询可以说是sql语句中比较复杂的一部分,但是掌握好了的话就可以提高查询效率.下面将介绍带in的子查询.带比较运算符的子查询.带any/all的子查询.带exists的子查询以及基于 ...
- 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)
学习了连接查询和嵌套查询. 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了. 此电脑右键-管理-展开服务与应用程序 ...
- sql镶嵌查询_sql数据库的嵌套查询
实验四:数据库的嵌套查询实验 学号: 姓名: 实验四:数据库的嵌套查询实验 实验目的: 加深对嵌套查询语句的理解. 实验内容: 使用 IN . 比较符. ANY 或 ALL 和 EXISTS 操作符进 ...
最新文章
- win10电脑黑屏只有鼠标箭头_电脑开机进入系统后显示黑屏,只能看到一个鼠标指针,如何解决?...
- JavaScript pop()函数弹出数组最后数据
- android调用oncreate,Android - 每次启动时都会调用onCreate
- 塑造Visual Studio的未来
- mysql杨辉三角_两个经典的小例子:杨辉三角和水仙花
- C++ 简单实现unorderset和unordermap
- 网站性能测试指标:QPS、TPS、吞吐量、响应时间概述
- Google 重磅发布 Flutter 2 !一套代码横扫 5 大系统
- 比较nio大体上优于io的方面
- linux中iso源码解压_Linux系统下iso文件的制作和解压以及加载
- 开源数据库迁移工具canal
- 微信小程序经纬度获取地图导航(导航接入第三方)
- Android和C#实现实时视频传输Demo
- Hack The Box-meow
- MATLAB在动态经济学中的应用,MATLAB在动态经济学中的应用
- 输入一串字符,并判断其中英文字符和数字字符的个数——C语言实现(C语言练习)
- ROS2入门:turtlesim的奇妙曲线轨迹
- Workflow设计模式指的什么?
- 东北林大计算机考研难吗,一位考取东北林大信息学院农业信息化学姐的考研经验分享...
- uni-app IOS的threeJS本地obj、mtl文件的读取