mysql update +多表联结

以这三张表为例:
表1 school.course;
±-----±-------±-----+
| c_id | c_name | t_id |
±-----±-------±-----+
| 01 | 语文 | 02 |
| 02 | 数学 | 01 |
| 03 | 英语 | 03 |
±-----±-------±-----+
3 rows in set (0.00 sec)

表2 school.teacher;
±-----±-------+
| t_id | t_name |
±-----±-------+
| 01 | 张三 |
| 02 | 李四 |
| 03 | 王五 |
±-----±-------+
3 rows in set (0.00 sec)

表3 school.score;
±-----±-----±--------+
| s_id | c_id | s_score |
±-----±-----±--------+
| 01 | 01 | 80 |
| 01 | 02 | 90 |
| 01 | 03 | 99 |
| 02 | 01 | 70 |
| 02 | 02 | 60 |
| 02 | 03 | 80 |
| 03 | 01 | 80 |
| 03 | 02 | 80 |
| 03 | 03 | 80 |
| 04 | 01 | 50 |
| 04 | 02 | 30 |
| 04 | 03 | 20 |
| 05 | 01 | 76 |
| 05 | 02 | 87 |
| 06 | 01 | 31 |
| 06 | 03 | 34 |
| 07 | 02 | 89 |
| 07 | 03 | 98 |
±-----±-----±--------+

**需求:**把“SCORE”表中“张三”老师教的课的成绩都更改为此课程的平均成绩

代码:

update school.score as m 
join (select avg(h.s_score) as t,h.c_id as c_id  from school.course j join school.teacher k on j.t_id =k.t_id join school.score h on j.c_id=h.c_id where k.t_name='张三' group by k.t_id)  as n
on m.c_id=n.c_id
set m.s_score=n.t;

分析:
1.将三张表连接
2. 找出更新值,即张三老师所教课的平均值
3. 将原值替换为平均值

update 后紧跟的是需要更新的表A 这里是school.score

join 后跟的是表B,表B包含更新用的新值和与和表A联结的字段

on 两张表联结的字段

set 新旧值得更新

重点就是找出表B,表b的求取就变成了 简单的select语句了

#ps:这是Mysql的写法,sql server的写法是不一样

猜你喜欢

转载自blog.csdn.net/weixin_44595372/article/details/88598449