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 销售表)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值