携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
这个是我们本次内容用到的表。建表和插入数据省略了。
问题引入:
针对上面的表,试查询和“刘晨”同学在同一个系的学生学号,姓名。
分析:
我们把原问题分成两部分,的一部分(和“刘晨”同学在同一个系的学生)第二部分(学号,姓名。)
那么我们可以知道,我们需要查询的是学生学号姓名,查询他们条件是和xx同学同一个系。
第一步:查询和“刘晨”同学在同一个系的学生
select sdept from student where sname="刘晨";
根据原表我们可以知道刘晨在计算机系,那么
第二步:查询在计算机系的同学学号姓名。
select sno,sname from student where sdept="计算机";
但是这样的话,我们是分两次完成的,能不能只用一个sql完成?
这样的话,我们就把第一次查询到计算机的sql变成第二个查询的条件
sql如下:
select sno,sname from student where sdept in (select sdept from student where sname="刘晨");
这里我们发现了一个新词 in
谓词in是连接父子查询最常用的谓词,因为这里子查询只有一个结果所以in可以改成=。
select sname,sno属于外层查询,select sdept属于内查询
由此引出嵌套查询定义:
一个select-from-where语句称为一个查询块,把一个查询块嵌套到另外一个查询块的where或者having子句里面的查询,叫做嵌套查询
思考:系统对于嵌套查询的执行顺序怎么样的啊?
根据上面实例,我们可以知道,贤进行内层查询,然后把子查询结果作为父查询条件。
例题
例如1:查询选修了课程名字为“信息系统”的学生学号。
和之前同理,我们分成两步,前面(查询选修了课程名字为计算机系统),后面(查询学生学号)
第一步:查询选修了课程名字为计算机系统的学生学号
select cno from course where cname="信息系统";(答案 cno=3)
第二步:查询学生学号
select sno from sc where cno=3;
构建嵌套查询:
select sno from sc where cno in (select cno from course where cname="信息系统");
注意:该查询仅为一层嵌套,sql嵌套查询允许多层嵌套格式。
例如2:查询选修了课程名字为“信息系统”的学生姓名。
分析:这里我们需要用到三张表,先在course查课程名字为信息系统的课程号,然后通过sc表查询到对应学生学号,最后通过学号在学生表里面查询姓名。
那么需要分三步
第一步,第二步,和例题一样,查询结果为sno=200215121,200215122
第三步:找到sno=200215121,200215122的学生姓名
select sname from student wheree sno=200215122 or sno=200215121;
构建嵌套查询为:
select sname from student where sno in (select sno from sc where cno in (select cno from course where cname="信息系统"));
上面涉及到查询都是相等,如果子查询返回为单值,并且父子查询需要进行毕竟,我们使用比较连接父连接。
例如3:查询年龄大于“张立”同学的学生学号姓名。
和上面分布一样,外查询学生学号姓名,内查询张立年龄。
select sname,sno from student where sage>(select sage from student where sname='张立')
总结
- 根据查询结果记录数量,子查询分为单行子查询和多行子查询;根据内外查询的相关性,子查询又可以分为不相关子查询和相关子查询;对于单行子查询,经常和操作符 >、<、=、<>、>=、<= 搭配使用,对于多行子查询,经常和操作符
in、any、all搭配使用。