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

重 点
把括号里的查询单独拿出来能跑通,是写对子查询的第一个检验标准。
打个比方
像问比小王高的同学有谁,得先量出小王的身高,再拿这个数去比。
前面的条件都写死了常数,现在让它自己去查。

把括号里的查询单独拿出来能跑通,是写对子查询的第一个检验标准。
像问比小王高的同学有谁,得先量出小王的身高,再拿这个数去比。
先把括号里那句算完,把结果当常数交给外面。

括号里那句不提外面的表,它就是普通子查询,只在开头算一次。
括号里查出一个年龄,外面拿它去比大小。

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

括号里的查询要能唯一定位一行,条件写在姓名上就得保证姓名不重。
如果表里有两位教师同名,这条语句会怎样?
课程名在课程表里,课程号在授课表里,用子查询过桥。

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

括号里返回多行时,比较符后面不加量词,机器一定报 1242。
ANY 还能写成 SOME,两个词在 MySQL 里完全等价。
只要比其中任意一个大就算数,门槛落在最小值。

大于 ANY 等价于大于子查询的最小值,写成 MIN 更容易看懂。
查一个值在不在这一组里,两种写法完全一样。

| 写法 | 读作 |
|---|---|
| cno = ANY (...) | 等于其中任意一个 |
| cno IN (...) | 属于这个集合 |
IN 更接近口语,写法上也短,实际代码里用 IN 的远多于用等号加 ANY。
只有等号加 ANY 能简写成 IN,大于小于这些量词必须老老实实写全。
先查出选了这门课的学号,再拿学号去查姓名。

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

ALL 要求比每一个都高,所以门槛是这一组里的最大值。
先建一张空表,再用 INSERT 接一条 SELECT 灌进去。

INSERT 后面接 SELECT 时不写 VALUES,列数和顺序要和目标表对上。
平均工资是小数,存进整数列会被四舍五入,小数部分就丢了。
先查出要改哪几门课,再统一加课时。

改数据前先把同样的条件用 SELECT 跑一遍,确认改的正是那几行。
线上改数据的规矩是先把要动的那几行查出来存一份,再动手。
UPDATE 忘了写 WHERE 会发生什么?
一边改这张表,一边从它自己里面查,MySQL 不许。
