数据库原理与应用 第 6 章 · 第五节
课程第 6 章第五节 接下来先算里面比谁年龄大职称不同换成表名返回一组ANY 的门槛IN 简写谁选了 c1ALL 的门槛存进新表子查询改数据拿平均值改 版式
第 6 章 数据表中的数据查询 · 第五节

子查询

把一条查询嵌进另一条的条件里,返回一个值或一组值。
本 节 知 识 点
  1. 46条件里的值也能现查
  2. 47普通子查询只跑一遍
  3. 48返回一个值的子查询
  4. 49不等号也能接子查询
  5. 50子查询把名字换成编号
  6. 51括号里返回好几行怎么办
  7. 52大于 ANY 就是大于最小的
  8. 53IN 就是等号加 ANY
  9. 54IN 子查询查名单
  10. 55大于 ALL 就是大于最大的
  11. 56查询结果可以直接入库
  12. 57UPDATE 的条件里也能嵌
  13. 58课本这条在真机上跑不通
46
第 6 章 · 第五节

条件里的值也能现查

前面的条件都写死了常数,现在让它自己去查。

第 46 页课件

重 点

把括号里的查询单独拿出来能跑通,是写对子查询的第一个检验标准。

打个比方

像问比小王高的同学有谁,得先量出小王的身高,再拿这个数去比。

47
第 6 章 · 第五节

普通子查询只跑一遍

先把括号里那句算完,把结果当常数交给外面。

第 47 页课件

试一试看它到底跑几遍

这是
    看括号里那句用不用外面的字段,就知道它要跑几遍。

    重 点

    括号里那句不提外面的表,它就是普通子查询,只在开头算一次。

    48
    第 6 章 · 第五节

    返回一个值的子查询

    括号里查出一个年龄,外面拿它去比大小。

    第 48 页课件

    重 点

    外面用等号或大于号时,括号里必须只返回一行,多一行就报 1242。

    知道更多自连接也能做

    这类题多半都有自连接的等价写法,两种都会写更保险。

    上机做

    上机四第 1 题 查比某人年龄大的

    49
    第 6 章 · 第五节

    不等号也能接子查询

    括号里查出一个职称,外面找和它不一样的。

    第 49 页课件

    重 点

    括号里的查询要能唯一定位一行,条件写在姓名上就得保证姓名不重。

    想一想

    如果表里有两位教师同名,这条语句会怎样?

    50
    第 6 章 · 第五节

    子查询把名字换成编号

    课程名在课程表里,课程号在授课表里,用子查询过桥。

    第 50 页课件

    重 点

    凡是能用子查询写的等值查询,都能改写成连接,反过来不一定。

    打个比方

    像只记得书名去图书馆,先在目录里查到索书号,再拿索书号去书架上找。

    上机做

    上机四第 2 题 用课程名查开课日期

    51
    第 6 章 · 第五节

    括号里返回好几行怎么办

    在比较符和括号之间加上 ANY 或者 ALL。

    第 51 页课件

    重 点

    括号里返回多行时,比较符后面不加量词,机器一定报 1242。

    知道更多SOME 是别名

    ANY 还能写成 SOME,两个词在 MySQL 里完全等价。

    52
    第 6 章 · 第五节

    大于 ANY 就是大于最小的

    只要比其中任意一个大就算数,门槛落在最小值。

    第 52 页课件

    试一试两个量词的分界线

    条件
    计算机专业的四份工资
    其他专业的教师
    同一个子查询,ANY 比最小的,ALL 比最大的。

    重 点

    大于 ANY 等价于大于子查询的最小值,写成 MIN 更容易看懂。

    53
    第 6 章 · 第五节

    IN 就是等号加 ANY

    查一个值在不在这一组里,两种写法完全一样。

    第 53 页课件

    分清楚两个写法

    写法读作
    cno = ANY (...)等于其中任意一个
    cno IN (...)属于这个集合

    重 点

    IN 更接近口语,写法上也短,实际代码里用 IN 的远多于用等号加 ANY。

    知道更多不等号没有简写

    只有等号加 ANY 能简写成 IN,大于小于这些量词必须老老实实写全。

    54
    第 6 章 · 第五节

    IN 子查询查名单

    先查出选了这门课的学号,再拿学号去查姓名。

    第 54 页课件

    重 点

    括号里 SELECT 后面只能有一列,多一列机器会报 1241 操作数列数不对。

    打个比方

    先在选课表里抄下一串学号,再拿这串学号去学生表里换成姓名。

    上机做

    上机四第 3 题 两张表接力查

    55
    第 6 章 · 第五节

    大于 ALL 就是大于最大的

    要比每一个都大,门槛抬到最大值。

    第 55 页课件

    记牢它两个量词

    1. ANY 比最小的
    2. ALL 比最大的
    3. 换成 MIN 和 MAX 更好懂

    练一练

    计算机专业四位教师工资是 3800、2800、3200、2600,sal > ALL 的门槛是多少?
    1. A2600
    2. B3200
    3. C3800
    答案 C

    ALL 要求比每一个都高,所以门槛是这一组里的最大值。

    上机做

    上机四第 4 题 ANY 与 ALL 对比

    56
    第 6 章 · 第五节

    查询结果可以直接入库

    先建一张空表,再用 INSERT 接一条 SELECT 灌进去。

    第 56 页课件

    重 点

    INSERT 后面接 SELECT 时不写 VALUES,列数和顺序要和目标表对上。

    知道更多类型会被裁

    平均工资是小数,存进整数列会被四舍五入,小数部分就丢了。

    上机做

    上机四第 5 题 把统计结果存起来

    57
    第 6 章 · 第五节

    UPDATE 的条件里也能嵌

    先查出要改哪几门课,再统一加课时。

    第 57 页课件

    重 点

    改数据前先把同样的条件用 SELECT 跑一遍,确认改的正是那几行。

    知道更多改之前先备份

    线上改数据的规矩是先把要动的那几行查出来存一份,再动手。

    想一想

    UPDATE 忘了写 WHERE 会发生什么?

    58
    第 6 章 · 第五节

    课本这条在真机上跑不通

    一边改这张表,一边从它自己里面查,MySQL 不许。

    第 58 页课件

    重 点

    自己改自己查会报 1093,得先把平均值查出来,再写成常数改回去。

    知道更多派生表可以绕

    把子查询包一层当成临时表,MySQL 就认了,这是标准的绕法。

    上机做

    上机四第 6 题 亲手撞一次 1093

    保山学院·人工智能教研室·曹鼎鼎