子查询要先拆开单独跑
把括号里那句单独跑通,再套回去,这是最省事的写法。
重 点
第二条和第三条查的是同一件事,一个用子查询一个用自连接。
想一想
子查询和自连接,你更容易看懂哪一种?
把括号里那句单独跑通,再套回去,这是最省事的写法。
第二条和第三条查的是同一件事,一个用子查询一个用自连接。
子查询和自连接,你更容易看懂哪一种?
课程名在课程表,开课日期在授课表,中间用子查询过桥。
外面用等号时括号里必须只出一行,出两行就报 1242。
第三条是连接写法,多数情况下比子查询快,因为机器只扫一遍。
等号改成 IN,括号里就可以返回好几行。
第三条故意用等号,括号里有三行,机器报 1242 子查询返回多行。
改成 IN 是问在不在这一组里,加 LIMIT 1 是只取一行来比,问的不是一回事。
同一个子查询,一个比最小的,一个比最大的。
第一条先把那四份工资看清楚,后两条的门槛就是这一组的最小值和最大值。
先建一张空表,再用 INSERT 接 SELECT 把结果灌进去。
最后两条对着看,平均工资的小数部分被整数列裁掉了。
要保住小数,新表那一列该改成什么类型?
一边改这张表一边从它自己里面查,MySQL 直接拦下。
第二条报 1093,第三条能过,区别在于查的是不是被改的那张表。
绕法是先把值查出来写成常数,或者把子查询包一层当临时表。
把括号里那句单独拿出来跑,跑不通的就是相关子查询。
第一条单独跑必然报错,因为 s.sno 要等外层给值才有意义。
学生表有八行,括号里那句就跑八遍,这是相关子查询最贵的地方。
括号里能查出行就是真,查不出就是假。
EXISTS 括号里写星号就行,它只看有没有行,不看查出来的是什么。
一个人要么选了这门课要么没选,两条查询把八个人分成两拨,合起来正好是全体。
两条查询各查各的,列数和类型对得上就能并。
最后一条列数不一样,机器报 1222,这是 UNION 唯一的硬要求。
第一条用一句 OR 就能写完,UNION 真正的用处是并起两张不同的表。
不看上面的答案,自己把这五道题写出来。
最后一条把学生和教师并在一起,这才是 UNION 该干的活。
第二条的答案和讲义对不上是正常的,第 6 题那条 UPDATE 已经把课时改过了。
要让这一页回到最初的数据,该按哪个按钮?