之前在工作中碰到了update多表聯(lián)合更新的問題作儿,總結(jié)了這篇文章;這兩天又碰到了update中的另一個(gè)坑馋劈,就放在一起吧攻锰。
第一部分:update與join的聯(lián)合使用
1、inner join
現(xiàn)有兩張表instr_test_left和instr_test_right妓雾,表數(shù)據(jù)分別如下:
instr_test_left
instr_test_right
UPDATE instr_test_right a,instr_test_left b
SET a.`equ_catr`='2222',b.`equ_catr`='2222'
WHERE a.`id`=b.`id`
或者
UPDATE instr_test_right a
INNER JOIN instr_test_left b
ON a.`id`=b.`id`
SET a.`equ_catr`='2222',b.`equ_catr`='2222';
結(jié)果都是
left表
right表
left表和right表能匹配上的id為001,002,003娶吞,兩個(gè)表中id等于這三個(gè)值的記錄被更新。
如果加上where條件械姻,比如
left表現(xiàn)被修改為
現(xiàn)在進(jìn)行如下更新:
UPDATE instr_test_right a
INNER JOIN instr_test_left b
ON a.`id`=b.`id`
SET a.`equ_catr`='9999',b.`equ_catr`='9999'
WHERE b.`equ_catr`='5555';
或者
UPDATE instr_test_right a,instr_test_left b
SET a.`equ_catr`='9999',b.`equ_catr`='9999'
WHERE a.`id`=b.`id`
AND b.`equ_catr`='5555';
結(jié)果 :
left表
right表
對(duì)于right表來說议蟆,能夠與left表匹配上id且equ_catr字段等于5555的只有id為003 的那條記錄官紫;對(duì)于left表來說盟猖,能夠與right表匹配上且equ_catr字段等于5555的有三條id等于003俩块,equ_catr等于5555的記錄。
2欢揖、left join
現(xiàn)在right表如下
left表如下
不加where陶耍,做如下更新
UPDATE instr_test_right a
LEFT JOIN
instr_test_left b
ON a.`id`=b.`id`
SET a.`equ_catr`='7777',b.`equ_catr`='7777'
結(jié)果
left表
right表
在不加where條件的情況下,作為左連接的主表right表浸颓,無論是否能夠通過id與left表關(guān)聯(lián)上物臂,該表所有記錄的equ_catr字段都被更新成7777旺拉,因此在查詢時(shí)产上,left join的主表需要顯示該表所有的記錄棵磷,在update時(shí),left join的主表需要更新所有的記錄晋涣,而作為被關(guān)聯(lián)的表left仪媒,只有能夠匹配上的記錄(id等于001和002)被做了更新。
同理谢鹊,right join也是類似的結(jié)果算吩。
當(dāng)加上了where條件,
UPDATE instr_test_right a
LEFT JOIN
instr_test_left b
ON a.`id`=b.`id`
SET a.`equ_catr`='7777',b.`equ_catr`='7777'
WHERE b.`equ_catr`='3333'
結(jié)果
left表
right表
當(dāng)加上where條件之后佃扼,作為主表的right表偎巢,只對(duì)能夠與left表匹配上且left表的equ_catr等于3333的記錄做了更新,left表的結(jié)果與之前一樣兼耀。
第二部分:update中set和and聯(lián)合使用
之前做多字段更新的時(shí)候压昼,查了下update的語法
UPDATE table_name
SET field1=new-value1, field2=new-value2
[WHERE Clause]
當(dāng)時(shí)就按照這個(gè)格式寫了,然后前兩天在修改以前的SQL瘤运,看到update同時(shí)更新多個(gè)字段時(shí)窍霞,第一反應(yīng)的語法是多字段中間用and連接,還以為之前的寫錯(cuò)了拯坟,但是修改之后運(yùn)行發(fā)現(xiàn)結(jié)果不對(duì)但金。
假設(shè)現(xiàn)在有這樣一個(gè)表
現(xiàn)在要把sat='好評(píng)'的score修改為95,goods_id修改為'g10'郁季,
update atest
set score=95,goods_id='g10'
where sat='好評(píng)'
結(jié)果:
顯示運(yùn)行成功冷溃,表中數(shù)據(jù)如下
修改成功,再嘗試and的寫法
update atest
set score=95
and goods_id='g10'
where sat='好評(píng)'
結(jié)果
同樣運(yùn)行成功梦裂,但是此時(shí)表中數(shù)據(jù)為
sat='好評(píng)'的記錄中秃诵,goods_id的值未被修改,score被修改為0而不是95塞琼。可以再看兩個(gè)例子菠净,如果要修改的是user_name和score字段是什么結(jié)果
update atest
set user_name='kk' AND score=95
where sat='好評(píng)'
結(jié)果
此時(shí)報(bào)錯(cuò)'kk'不是數(shù)字類型
另一個(gè)例子
update atest
set user_name=234 AND goods_id='g10'
where sat='好評(píng)'
結(jié)果
產(chǎn)生上述結(jié)果的原因是
set和and聯(lián)合使用的時(shí)候
正確的執(zhí)行順序是先and再set
update atest
set score=(95 and goods_id='g10')
where sat='好評(píng)'
95 and goods_id='g10'這條語句的執(zhí)行結(jié)果是false,即0彪杉,而set goods_id='g10' 這條語句根本沒有執(zhí)行毅往,所以score被修改為0,而goods_id未被修改派近,此外攀唯,根據(jù)上面的運(yùn)行結(jié)果 set 字段=[value1 and 字段=vaule2],如果value1的類型不是數(shù)字型會(huì)報(bào)類型錯(cuò)誤渴丸,當(dāng)然set and的語法本身就是個(gè)坑侯嘀,不用糾結(jié)它的數(shù)據(jù)類型問題另凌。
綜上,在寫SQL的時(shí)候戒幔,有些不熟悉的語句還是查詢一下官方語法吠谢,想當(dāng)然有時(shí)候會(huì)出錯(cuò)。