发布:2020/6/11 17:53:21作者:管理员 来源:本站 浏览次数:1246
首先两张表test1 test2 的表结构以及记录如下
SELECT * FROM test1
1
这里写图片描述
SELECT * FROM test2
1
这里写图片描述
两张表通过名字字段进行关联
SELECT * FROM test1 AS t1 LEFT JOIN test2 AS t2 ON t1.name = t2.name2
1
这里写图片描述
现在需求如下:
将test2表中名字相同的分数更新到test1
UPDATE test1 AS t1 SET t1.score = (SELECT t2.score FROM test2 AS t2 WHERE t1.name = t2.name2)
1
这种写法会存在一种问题:子查询中没有查询出的记录将被更新为null
SELECT * FROM test1
1
这里写图片描述
可以看出name = 'pc' 的分数变成了null 因为在test2 中并没有关联记录
我们可以加上限制条件解决这个问题
UPDATE test1 AS t1 SET t1.score = (SELECT t2.score FROM test2 AS t2 WHERE t1.name = t2.name2) WHERE EXISTS (SELECT 1 FROM test2 AS t2 WHERE t1.name = t2.name2 )
1
这样我们更新的表记录已经变为 关联的记录
SELECT * FROM test1
1
这里写图片描述
这里我们再说一下另一种关联更新
UPDATE test1 AS t1 INNER JOIN test2 AS t2 ON t1.name = t2.name2 SET t1.score = t2.score
1
即可达到要求,不需要后面的exists 从sql 可以看出 我们用的是inner join 也就是只有满足关联查询的才会被更新,如果使用leftjoin rightjoin 则要加过滤条件