MySQL对数据的基本操作三:UPDATE语句
注:(1)內(nèi)連接可以不使用ON或者WHERE;外連接必須使用ON子句,否則會(huì)報(bào)錯(cuò)!!!
? ? ? ?(2)UPDATE確定數(shù)據(jù)源頭(或者說(shuō),UPDATE子句確定“待操作數(shù)據(jù)集”),WHERE子句:對(duì)“待操作數(shù)據(jù)集”做二次篩選。
? ? ? ?(3)案例4:這個(gè)例子說(shuō)明,UPDATE語(yǔ)句可以同時(shí)修改多張表。。。
? ? ? ?(4)子查詢(xún)不能在UPDATE語(yǔ)句中使用的原因:首先,在UPDATE中使用子查詢(xún),這會(huì)是相關(guān)子查詢(xún),效率很低;然后,MySQL不允許對(duì)要更改或要?jiǎng)h除記錄的數(shù)據(jù)表做子查詢(xún)(很顯然,動(dòng)腦子想一想也明白了);
目錄
一:UPDATE語(yǔ)句簡(jiǎn)介
二:案例:不涉及表連接? 的案例(這部分不難)
三:案例:涉及表連接
一:UPDATE語(yǔ)句簡(jiǎn)介
●?UPDATE子句,選擇要修改的表;UPDATE子句只執(zhí)行一次;
●?IGNORE關(guān)鍵字可寫(xiě)可不寫(xiě),作用是在寫(xiě)入數(shù)據(jù)的時(shí)候,如果遇到?jīng)_突就直接忽略。
●?WHERE子句:篩選要修改的記錄;
●?ORDER BY子句的應(yīng)用場(chǎng)合:把篩選出的記錄進(jìn)行排序。比如,當(dāng)修改記錄的主鍵的時(shí)候,給主鍵值都加1的時(shí)候,就需要把數(shù)據(jù)降序排列,這樣才不會(huì)在修改主鍵的時(shí)候發(fā)生唯一性沖突;(自然如果給主鍵值都減1,就需要把數(shù)據(jù)升序排列了);
● LIMIT子句:這兒的LIMIT子句只能寫(xiě)一個(gè)參數(shù);
下面的執(zhí)行順序:UPDATE子句→WHERE子句→ORDER BY子句→LIMIT子句→SET子句;
二:案例:不涉及表連接? 的案例(這部分不難)
案例1:把每個(gè)員工的編號(hào)和上司的編號(hào)+1,用ORDER?BY子句完成;
這個(gè)例子很簡(jiǎn)單,不涉及多表查詢(xún);
UPDATE t_emp SET empno=empno+1,mgr=mgr+1 ORDER BY empno DESC;……………………………………………………
案例2:把月收入排在前三名的員工,底薪減100元,用LIMIT子句完成
注意,LIMIT子句的用法。
這個(gè)例子很簡(jiǎn)單,不涉及多表查詢(xún);
UPDATE t_emp SET sal=sal-100 ORDER BY sal+IFNULL(comm,0) DESC LIMIT 3;……………………………………………………
案例3:把10部門(mén)中,工齡超過(guò)20年的員工,底薪增加200元,WHERE子句
這個(gè)例子很簡(jiǎn)單,不涉及多表查詢(xún);
UPDATE t_emp SET sal=sal+200 WHERE deptno=10 AND FLOOR(DATEDIFF(NOW(),hiredate)/365)>=20;三:案例:涉及表連接
案例4:把ALLEN調(diào)往RESEARCH部門(mén),職務(wù)調(diào)整為ANALYST;
這個(gè)案例中,涉及到了多張表,RESEARCH部門(mén)的編號(hào)不知道;
最直接的思路:使用子查詢(xún)。
UPDATE t_emp e SET job="ANALYST",deptno=(SELECT d.deptno FROM t_dept d WHERE d.dname="RESEARCH") WHERE e.ename="ALLEN";但是上面的做法中,子查詢(xún)是相關(guān)子查詢(xún),如果需要修改的不止ALLEN一人,那么【SELECT d.deptno FROM t_dept d WHERE d.dname="RESEARCH"】將會(huì)執(zhí)行很多次。。。
涉及多張表的時(shí)候,需要引入表連接:
下面的兩種表連接都是內(nèi)連接的語(yǔ)法:內(nèi)連接的,其中包括使用ON子句,和使用ON子句。
利用表連接的方式實(shí)現(xiàn):這種騷操作。。。(這兒非常重要!!!!!,是核心!!!)
UPDATE t_emp e JOIN t_dept d SET e.deptno=d.deptno,e.job="ANALYST",d.loc="成都" WHERE e.ename="ALLEN" AND d.dname="RESEARCH";分析:執(zhí)行過(guò)程是,現(xiàn)將倆表做笛卡爾積(因?yàn)闆](méi)有使用ON子句啦)從t_emp表中篩選出e.name="ALLEN"這條記錄,從t_dept表中篩選出d.dname="RESEARCH"這條記錄,其實(shí),這所謂的兩條記錄在【笛卡爾積】中是在一條記錄上的;此時(shí),已經(jīng)分別在兩個(gè)表中各獲得了一條記錄,然后分別在獲取的這兩條記錄上執(zhí)行執(zhí)行【SET e.deptno=d.deptno,e.job="ANALYST",d.loc="成都"】。然后,對(duì)此條記錄的操作就能影響到原表上。
這個(gè)表連接的例子其實(shí)并不難,很簡(jiǎn)單,多想一下表連接的那個(gè)結(jié)果集,,,,,
同時(shí),這個(gè)例子說(shuō)明,UPDATE語(yǔ)句可以同時(shí)修改多張表。。。
……………………………………………………
案例5:把底薪低于公司平均底薪的員工,底薪增加150元;
【公司的平均底薪】和【誰(shuí)的底薪低于公司的平均底薪】不知道;
我的解決方案:還是這種很騷的操作,,,
UPDATE t_emp e1 JOIN (SELECT AVG(sal) aa FROM t_emp) e2 SET e1.sal=e1.sal+150 WHERE e1.sal<e2.aa;注:這個(gè)例子和【案例4】結(jié)合后,可以發(fā)現(xiàn),這種表連接的騷操作,可以應(yīng)用于多條記錄的情況。
即,重復(fù)下【案例4】中的話(huà),這些在笛卡爾積上挑選出的記錄,對(duì)這些記錄的更改可以影響到原表上。
通過(guò)這個(gè)例子,更加說(shuō)明,UPDATE子句是指執(zhí)行一次的。
標(biāo)準(zhǔn)做法:和我的做法類(lèi)似,只是這兒將條件放在了ON子句中,我的做法是將條件放在了WHERE子句中。
UPDATE t_emp e1 JOIN (SELECT AVG(sal) aa FROM t_emp) e2 ON e1.sal<e2.aa SET e1.sal=e1.sal+150;……………………………………………………
UPDATE語(yǔ)句的表連接的第三種方式:外連接的語(yǔ)法,外連接的時(shí)候,條件只能寫(xiě)在ON子句中,,,而且ON子句不能少!!!!!
案例6:把沒(méi)有部門(mén)的員工,或者SALES部門(mén)低于2000底薪的員工,都調(diào)往20部門(mén)。
涉及到多張表,需要表連接;張三沒(méi)有部門(mén),連接時(shí)需要保留,所以需要外連接;
第一種錯(cuò)誤方案:
UPDATE t_emp e LEFT JOIN (SELECT deptno FROM t_dept WHERE dname="SALES") dd ON e.deptno=NULL OR (e.sal<=2000 AND e.deptno=dd.deptno) SET e.deptno=20;可以發(fā)現(xiàn),實(shí)際效果出錯(cuò)了如BLACK的部門(mén)也沒(méi)改成20了。首先,判斷字段是不是空,需要IS?NULL?而不是=NULL;
動(dòng)動(dòng)腦子:在左連接的時(shí)候,左邊的記錄都會(huì)被保留下來(lái)!!!!!!!!!!所以,這兒的結(jié)果是錯(cuò)誤的,deptno全變成20了。。。
第二種錯(cuò)誤方案:錯(cuò)誤原因,經(jīng)過(guò)多次測(cè)試,發(fā)現(xiàn)左連接和右連接必須要有ON子句,否則會(huì)報(bào)錯(cuò)。這個(gè)需要后續(xù)確定,并在外連接的那篇博客中標(biāo)記一下。
UPDATE t_emp e LEFT JOIN (SELECT deptno FROM t_dept WHERE dname="SALES") dd SET e.deptno=20 WHERE e.deptno IS NULL OR (e.sal<=2000 AND e.deptno=dd.deptno);標(biāo)準(zhǔn)做法:這個(gè)例子很典型,調(diào)理清晰,好好想想,,,
這兒,UPDATE確定數(shù)據(jù)源頭(或者說(shuō),UPDATE子句確定“待操作數(shù)據(jù)集”),WHERE子句:對(duì)“待操作數(shù)據(jù)集”做二次篩選。
UPDATE t_emp e LEFT JOIN t_dept d ON e.deptno=d.deptno SET e.deptno=20 WHERE e.deptno IS NULL OR (d.dname="SALES" AND e.sal<2000);?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的MySQL对数据的基本操作三:UPDATE语句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle数据透明加密,oracle数
- 下一篇: 干货丨看金仓数据库如何支持透明加密!