在SQL语言中,一个
select-from-where
语句称为一个
查询块
嵌套查询
:将一个查询块
嵌套在
另一个查询块的where子句或having短语的
条件中的查询
称为嵌套查询
外尾查询(主查询) 内尾查询(子查询)
嵌套查询的执行顺序:先内尾查询,后外尾查询
嵌套查询分类(按子查询结果分):
-
单行子查询:子查询结果只返回一行
-
多行子查询:子查询结果返回多行
多行操作比较符:
in any all
============================================
简单嵌套查询:
主查询与子查询之间进行比较,使用<,>,=,>=,<=等运算符——子查询结果只返回一个值
eg:
从"student表中"查询"课程成绩“>96分的同学信息
select *
from student
where 学号 = (select 学号 from grade where 课程成绩>96)
检索出年龄小于女同学平均年龄的男同学的姓名和年龄
select 姓名,年龄
from student
where 性别='男' and 年龄<=(select avg(年龄) from student where 性别='女')
使用in的子查询:
主查询与子查询之间比较使用[多行比较操作符],使用in,any,all的子查询——子查询返回一列值
eg:
在student和grade表中,查询参加考试的同学信息
select *
from student
where 学号 in select 学号 from grade
使用
not in
的子查询
在“course”和“grade”表中,查询没有参加考试的课程信息
select *
from course
where 课程代号 not in(select 课程代号
from grade
where 课程代号 is not null)
attention:
-
当嵌套子查询中存在null值,避免使用not in
-
not in 效率不高,尽量少用
使用any的子查询:
(不常用)
就是将查询表达式与子查询的任一结果运算比较,若有一次为真,比较结果就为真
SQL中的定量谓词(any/all)不支持反操作,也就是说,不能在any或all前加not关键词——但可以使用‘<>’号表示否定
eg:
在“student”表中,查询“年龄”不等于平均年龄的所有学生信息
select *
from student
where 年龄<> any (select avg(年龄)
from student
group by性别)
使用all的子查询:
(不常用)
就是将查询表达式与子查询的结果运算比较,若每次的比较结果都为真时,结果才为真
eg:
查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄
select sname,sage
from student
where sage<all (select sage
from student
where sdept='cs')
and sdept<>'cs'
使用all的子查询(<>all)——不等于子查询结果的所有值
根据“销售表”的销售记录,查询“商品表”中没有被销售过的商品的信息
select * from 商品表
where 货号<>all (select 货号 from 销售表) #等价于 where 货号 not in (select 货号 from 销售表)