目录
- 查询块: ( SELECT语句 ),代表查询的中间结果集。
- 子查询:将一个查询块嵌入另一个中,称嵌套查询。上层查询块称父查询,下层查询块称子查询。
- 用途:对子查询进行集合检查来表达查询条件
1. 检查给定值是否在结果集中
- 查询条件:父查询的属性列 IN (子查询)。
- 含义:判断属性列的值是否在子查询的结果中。
【例】查询选修了 “数据库原理”的学生学号和姓名。
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
(SELECT 学号 FROM 选课表 WHERE 开课号 IN
(SELECT 开课号 FROM 开课表 WHERE 课号 IN
(SELECT 课号 FROM 课程表 WHERE 课名='数据库原理’ ) ) )
嵌套查询的特点:
(1)允许多层嵌套,求解顺序:由内向外。
(2)对用IN或比较运算符连接的子查询,其SELECT子句只能有一个列表达式,且左边列表达式和右边SELECT中的列表达式含义要相同。
2. 用给定值和结果集中的元素进行大小比较
含义:指父查询与子查询之间用比较运算符进行连接。分为单值比较和多值比较两类。
(1)单值比较
当子查询的结果集只包含一个值时,可用比较运算符直接连接父查询的列表达式和子查询结果集,实现其间的大小比较。 返回单值的子查询可参加任何合法的表达式运算。
【例】查询累计学分比“李民”多2分以上(含)的学生学号、姓名和累计学分。
SELECT Sno, Sname, Sgpa
FROM Student
WHERE Sgpa >= ( SELECT Sgpa FROM Student WHERE Sname = '李民' ) + 2
【例】查询学生S060101的姓名和平均成绩
SELECT 姓名, (SELECT SUM(成绩) FROM 选课表 WHERE 学号='S060101')
FROM 学生表
WHERE 学号='S060101'
(2)多值比较
当子查询的结果集包含多个值时,用给定值和结果集中的某个值进行的比较。此时父查询与子查询之间要用比较运算符后缀ANY或ALL进行连接。
【例】查询累计学分比计算机专业和信息管理专业所有学生都低的学生名单。
SELECT 姓名 FROM 学生表
WHERE 专业 <> '计算机' AND 专业 <> '信息管理' AND 累计学分<ALL (SELECT 累计学分 FROM 学生表 WHERE 专业 IN ('计算机' , '信息管理') )
本例也可以用统计函数实现:
SELECT 姓名 FROM 学生表
WHERE 专业 <> '计算机' AND 专业 <> '计算机' AND 专业 <> '信息管理' AND'累计学分 < (SELECT MIN(累计学分) FROM 学生表 WHERE 专业 IN ('计算机' , '信息管理') )
3.检查结果集是否为空
语法:[NOT] EXISTS (子查询)
- EXISTS:子查询结果集不空则返回真,否则返回假
- NOT EXISTS:子查询结果集为空则返回真,否则返回假
【例】查询选修了开课计划号为010101的学生姓名。
SELECT 姓名 FROM 学生表 AS S
WHERE EXISTS
(SELECT * FROM 选课表 AS E WHERE E.学号=S.学号 AND 开课号='010101' )
这类子查询具有如下特点:
(1)子查询的条件往往要引用上层查询所涉及的表。
(2)子查询的SELECT子句写成SELECT *即可。