练习10 子查询

发布 2021-05-08 20:05:28 阅读 2134

子查询。

子查询是嵌套于 select、select...into、insert...into、delete 或 update 语句内部或嵌套于另一个子查询内部的 select 语句。

子查询是相对的概念,构成子查询的select语句本身就是一个查询,当它被嵌入到其他查询语句中时,就被视为子查询。如果需要先进行一个查询,然后利用这个查询的结果作为条件的组成成分再进行查询的话,这个查询就是子查询。

子查询执行后会产生一个结果集,最为重要的是子查询的结果集将被用来形成其他查询的组成成分。

在查询中可以嵌套使用子查询,即在一个子查询中还可以再使用子查询。access中允许的嵌套查询的层次数最多为50。

子查询最常见的运用是用来组织复杂的查询条件,此外,可以用来生成结果列。

子查询的结果同一般选择查询一样,返回一个类似于表的由若干行列组成的结果集,这个结果集中包含的数据列,可能有多列,也可能只有一列。

在使用子查询组织查询条件实际上是使用子查询的结果集来组织条件。此时应该知道子查询的结果集的确切列数,因为这与如何利用子查询构成主查询条件相关。

与子查询结果集相关的运算共有四种:

any (some):测试子查询的结果集内的一行或多行是否满足特定条件。

all:测试子查询的结果集内的所有行是否满足指定条件。

in :测试某个值是否存在于子查询的结果集内。

exists:测试子查询是否返回了任何结果。

前三种运算都要求子查询的结果集只有一列数据,因为它们都需要指定一个字段来与子查询的结果集进行值的比较。最后一种运算仅关心结果集是否非空,不关心具体值。

例1. 查找与方晨同班的学生。

select 学生。学号,学生。姓名。

from 学生

where 学生。班级编号 in

select 班级编号 from 学生 where 姓名="方晨")

例2. 查询学号为“200713015”的同学所参加考试的全部课程的编号和名称。

select 课程编号,课程名称。

from 课程。

where 课程编号 in

select 课程编号 from 学生考试 where 学号="200713015")

例3. 查询与学号为“200713015”的同学同一时间考同一门课程的全部学生的学号和课程编号,结果按学号排序。

select 学号,课程编号。

from 学生考试。

where 场次 in

(select 场次 from 学生考试 where 学号="200713015")

and 课程编号 in

select 课程编号 from 学生考试 where 学号="200713015")

order by 学号。

如果想在显示学号、课程编号的同时,显示学生姓名和课程名称,则需要从“学生”表和“课程”表中检索出相应数据,此时,可以利用联接来实现。

例 学生。学号,学生。姓名, 课程。课程编号,课程。课程名称。

from 学生考试 inner join 学生 on 学生。学号=学生考试。学号) inner join 课程 on 课程。课程编号=学生考试。课程编号。

where 学生考试。场次 in

select 场次 from 学生考试 where 学号="200713015")

and 学生考试。课程编号 in

select 课程编号 from 学生考试 where 学号="200713015")

order by 学生。学号,课程。课程编号。

例5.找出“7月01日08:30-10:30”这一场次有监考任务的教师。

select 姓名。

from 教师监考 inner join 教师 on 教师。教师编号=教师监考。教师编号

where 场次="7月01日08:30-10:30"

或select 姓名。

from 教师。

where exists

select * from 教师监考 where 教师。教师编号=教师监考。教师编号 and 场次="7月01日08:30-10:30")

例6. 找出“7月01日08:30-10:30”这一场次没有监考任务的教师。

select 姓名。

from 教师。

where not exists

select * from 教师监考 where 教师。教师编号=教师监考。教师编号 and 场次=“7月01日08:30-10:30”)

或者。select 姓名。

from 教师。

where 教师编号 not in

select 教师编号 from 教师监考 where 场次="7月01日08:30-10:30")

利用子查询生成结果列。

在select后的字段列表中使用子查询的情况,主要是为了完成同时涉及多个表中数据的汇总处理,此时的子查询主要使用聚合函数来实现对其他表的统计、计算。

例7. 统计各学院班级数。

select 学院。学院编号, 学院。学院名称,

select count(*)from 班级 where 班级。学院编号=学院。学院编号) as 班级数

from 学院。

order by 学院。学院编号。

本例中的班级数列就是由子查询生成的列。可以看出该子查询的结果为一个值,该值就是对班级表中符合条件的记录的计数结果,也就是班级数。

习题1. 查询哪些教室没有安排考试。(利用子查询组织查询条件)

习题2. 统计各学院班级数。(利用子查询生成结果列)

习题3. 统计各学院学生人数。

练习6 子查询

课堂实训 6 姓名日期。学号专业。号 年级班级。成绩。任务名称 子查询。目的与要求 掌握子查询的使用方法。任务清单 1查询与王一平同系的教师姓名。2查询信管系的所有教师姓名,性别。3查询张宏 j a程序设计 的成绩。4查询计算机系的所有班级名称。5查询比 电子商务物流管理 计算机应用基础 学分都高的...

子查询 练习题

1 查询出比员工编号7654工资要高的全部员工的信息。select from emp where sal select sal from emp where empno 7654 2 查询出比员工编号7654工资高,同时与7788从事相同工作的全部员工的信息。select from emp wher...

作业 SQL 分组多表子查询

sql练习二。1 列出至少有一个员工的部门所有信息。2 列出薪金比 smith 多的所有员工。3 列出入职日期早于自己直接上司的所有员工的编号,姓名,部门名称。4 列出部门名称和这些部门的员工编号和姓名,同时列出没有员工的部门。5 列出所有 clerk 办事员 的姓名及其部门名称,部门的人数。6 查...