MySQL09-(嵌套查询)

在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:

  1. 当嵌套子查询中存在null值,避免使用not in
  2. not in 效率不高,尽量少用

使用any的子查询:

(不常用)
就是将查询表达式与子查询的任一结果运算比较,若有一次为真,比较结果就为真

SQL中的定量谓词(any/all)不支持反操作,也就是说,不能在any或all前加not关键词——但可以使用‘<>’号表示否定

not in <>all <>any

eg:
在“student”表中,查询“年龄”不等于平均年龄的所有学生信息

select *
from student
where 年龄<> any  (select avg(年龄)
                   from student
                   group by性别)

使用all的子查询:

(不常用)
就是将查询表达式与子查询的结果运算比较,若每次的比较结果都为真时,结果才为真

eg:
查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄

select sname,sage
from student
where sage<allselect sage
                  from student
                  where sdept='cs')
and sdept<>'cs'

使用all的子查询(<>all)——不等于子查询结果的所有值

根据“销售表”的销售记录,查询“商品表”中没有被销售过的商品的信息

select * from 商品表
where 货号<>allselect 货号 from 销售表)    #等价于     where 货号 not  in    (select 货号 from 销售表)
发布了49 篇原创文章 · 获赞 0 · 访问量 716

猜你喜欢

转载自blog.csdn.net/xiuxiuxiu666/article/details/104272327
今日推荐