隐藏

SQL批量更新

发布: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 则要加过滤条件