首先两张表test1
test2
的表结构以及记录如下
SELECT * FROM test1
SELECT * FROM test2
两张表通过名字字段进行关联
SELECT * FROM test1 AS t1 LEFT JOIN test2 AS t2 ON t1.name = t2.name2
现在需求如下:
将test2表中名字相同的分数更新到test1
UPDATE test1 AS t1 SET t1.score = (SELECT t2.score FROM test2 AS t2 WHERE t1.name = t2.name2)
这种写法会存在一种问题:子查询中没有查询出的记录将被更新为null
SELECT * FROM test1
可以看出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 )
这样我们更新的表记录已经变为 关联的记录
SELECT * FROM test1
这里我们再说一下另一种关联更新
UPDATE test1 AS t1 INNER JOIN test2 AS t2 ON t1.name = t2.name2 SET t1.score = t2.score
即可达到要求,不需要后面的exists
从sql
可以看出 我们用的是inner join
也就是只有满足关联查询的才会被更新,如果使用leftjoin rightjoin
则要加过滤条件