跳到主要内容

任务三 嵌套查询

知识点​

1. 什么是嵌套查询(子查询)?​

答:嵌套查询是指将一个SELECT语句(子查询)嵌套在另一个SELECT语句(父查询)中的查询方式。子查询可以作为父查询的条件、字段值或数据来源。包含子查询的语句通常处于外层,称为父查询或外层查询,被嵌套的SELECT语句称为子查询或内层查询。

2. 子查询根据返回结果可以分为哪几类?​

答:子查询根据返回结果可分为:

  • 标量子查询:返回单个值(一行一列),可以用于比较运算
  • 行子查询:返回一行多列的值
  • 列子查询:返回一列多行的值,常与IN、ANY、ALL配合使用
  • 表子查询:返回多行多列的结果,常用于FROM子句或EXISTS判断

3. 子查询根据与父查询的关系可分为哪两类?​

答:

  • 不相关子查询:子查询不依赖于父查询的数据,可以独立执行。执行时先执行子查询,再将结果作为父查询的条件
  • 相关子查询:子查询的执行依赖于父查询的数据,父查询每处理一行,子查询就执行一次

4. 使用比较运算符的子查询语法是什么?​

答:使用比较运算符(=、>、<、>=、<=、<>或!=)将父查询的字段与子查询的结果进行比较。子查询必须返回单个值(标量子查询)。语法格式:

SELECT 字段列表
FROM 表名
WHERE 字段名 比较运算符 (子查询);

例如:SELECT sname, sage FROM student WHERE sage > (SELECT AVG(sage) FROM student); 查询年龄大于平均年龄的学生。

5. IN子查询的作用和语法是什么?​

答:IN子查询用于判断某个值是否在子查询返回的集合中。子查询返回一列多行的结果。语法格式:

SELECT 字段列表
FROM 表名
WHERE 字段名 [NOT] IN (子查询);

例如:SELECT sname FROM student WHERE sno IN (SELECT sno FROM sc WHERE cno = '001'); 查询选修了001号课程的学生姓名。

6. EXISTS子查询的作用和语法是什么?​

答:EXISTS子查询用于判断子查询是否返回记录。如果子查询返回至少一条记录,则EXISTS返回TRUE,否则返回FALSE。EXISTS子查询通常使用 SELECT *,因为不关心具体字段值,只关心是否有记录返回。语法格式:

SELECT 字段列表
FROM 表名
WHERE [NOT] EXISTS (子查询);

例如:SELECT sname FROM student WHERE EXISTS (SELECT * FROM sc WHERE sc.sno = student.sno); 查询有选课记录的学生姓名。

7. EXISTS子查询是相关子查询还是不相关子查询?​

答:EXISTS子查询通常是相关子查询,因为子查询中通常引用了父查询的表字段作为条件。父查询每处理一行记录,就将该记录的字段值传给子查询进行判断,子查询根据条件返回是否有记录。

8. ANY和ALL运算符的作用是什么?​

答:ANY和ALL用于将一个值与子查询返回的一列值进行比较:

  • ANY:表示与子查询结果中的任意一个值满足比较关系即可,只要有一个满足就返回TRUE
  • ALL:表示必须与子查询结果中的所有值都满足比较关系才返回TRUE

语法:字段名 比较运算符 ANY/ALL (子查询)

9. ANY和ALL与比较运算符组合的含义是什么?​

答:

  • > ANY:大于子查询结果中的最小值
  • < ANY:小于子查询结果中的最大值
  • = ANY:等价于IN,等于子查询结果中的任意一个值
  • > ALL:大于子查询结果中的最大值
  • < ALL:小于子查询结果中的最小值
  • <> ALL:等价于NOT IN,不等于子查询结果中的任何值

10. 子查询可以出现在SELECT语句的哪些位置?​

答:子查询可以出现在以下位置:

  • WHERE子句:作为查询条件的一部分(最常见)
  • HAVING子句:对分组后的结果进行条件过滤
  • FROM子句:作为临时表提供数据来源(必须指定别名)
  • SELECT子句:作为输出字段的一个值(标量子查询)

例如FROM中的子查询:SELECT t.sdept, t.人数 FROM (SELECT sdept, COUNT(*) AS 人数 FROM student GROUP BY sdept) AS t WHERE t.人数 > 5;