SQL?Update更新數(shù)據(jù)的操作方法
在實(shí)際工作中,我們經(jīng)常需要更改數(shù)據(jù)庫(kù)中的數(shù)據(jù),更新數(shù)據(jù)用到的關(guān)鍵詞是UPDATE,其基本語(yǔ)法是:
UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2, ... WHERE 條件;
其中UPDATE 后面指定要更新數(shù)據(jù)的表,再用SET設(shè)置需要更新的列及其新值,可以同時(shí)更新多個(gè)列,用逗號(hào)分隔,where后面則加條件指定哪些行的數(shù)據(jù)需要被更新。例如,有如下一張Student表:

現(xiàn)在需要將小明的班級(jí)更新為301,同時(shí)他的年齡應(yīng)該是21歲,那么可以寫(xiě)成:
UPDATE dbo.Student
SET Class = '301',
Age = 21
WHERE Name = '小明';如果省略了WHERE 子句,即不加任何限定條件,那么表中所有行的數(shù)據(jù)都會(huì)被更新(即所有學(xué)生的class都成了301,age都是21了),這在大多數(shù)情況下不是我們想要的結(jié)果,因此使用時(shí)需格外注意。在實(shí)際工作中,強(qiáng)烈建議大家在執(zhí)行update之前,先將指定的條件用select語(yǔ)句查一遍,確保要更新的數(shù)據(jù)是對(duì)的。記得我剛開(kāi)始工作的時(shí)候,害怕更新錯(cuò)或者刪錯(cuò)數(shù)據(jù),每次update或者delete都在事務(wù)中進(jìn)行,確保沒(méi)問(wèn)題后再提交(事務(wù)我后面會(huì)介紹)。
上面是update的基本用法,也還有其他的情況,比如where后面所接的指定條件,可以是大于某個(gè)數(shù)或者在某個(gè)范圍內(nèi),或者跟一個(gè)子查詢(xún)等等,即這里where后面能寫(xiě)的條件跟select中是類(lèi)似的。因?yàn)楦虑?,先將需要更新的?shù)據(jù)篩選出來(lái),再執(zhí)行更新操作。例如將所有不及格同學(xué)的成績(jī)都改為60分,可以寫(xiě)成:
UPDATE dbo.Score SET Score = 60 WHERE Score < 60;
更新后的值也可以是一個(gè)表達(dá)式,而非某個(gè)具體的值,例如將學(xué)號(hào)001同學(xué)所有課程的分?jǐn)?shù)都加上10分,可以寫(xiě)成:
UPDATE dbo.Score SET Score = Score + 10 WHERE StudentNumber = '001';
要提醒的一點(diǎn)是:更新某條數(shù)據(jù)時(shí),各列是同一時(shí)間更新的,例如有下面一個(gè)SQL:
UPDATE dbo.T SET colA= colA + 10 , colB =colA+10;
執(zhí)行完之后,colA和colB的結(jié)果是一樣的,并不是說(shuō)colB在A已經(jīng)加了10的基礎(chǔ)上再執(zhí)行加10。
聯(lián)表更新:
在查詢(xún)數(shù)據(jù)的時(shí)候,如果要的數(shù)據(jù)是通過(guò)不同的條件指定的,這些條件并不在同一張表中,我們需要將多表關(guān)聯(lián)進(jìn)行查詢(xún)。同理,如果在更新數(shù)據(jù)的時(shí)候,給我們的條件也不全在同一張表中,我們就需要聯(lián)表來(lái)進(jìn)行更新。例如,Score表數(shù)據(jù)結(jié)構(gòu)如下:

現(xiàn)要求將李華同學(xué) 操作系統(tǒng)這門(mén)課程 的成績(jī)加一分,應(yīng)該怎么寫(xiě)SQL呢?
我們肯定要找到他對(duì)應(yīng)的學(xué)號(hào)和操作系統(tǒng)這門(mén)課程的編號(hào)是多少,因?yàn)镾core表里有的只是編號(hào)而沒(méi)有具體的值或課程名。(為什么不在Score表里存這些具體的值呢?這在后面表的設(shè)計(jì)原則中會(huì)介紹)。
所以我們可以分3步,查“李華”的StudentNumber--->查“操作系統(tǒng)”對(duì)應(yīng)的CourseNumber--->再將這兩次查到的結(jié)果放在update語(yǔ)句where后面的條件中。只是有點(diǎn)繁瑣,可以用聯(lián)表更新將這3步合為一步,即:
UPDATE A
SET A.Score = A.Score + 1
FROM dbo.Score AS A
INNER JOIN dbo.Student AS B
ON B.StudentNumber = A.StudentNumber
INNER JOIN dbo.Course AS C
ON C.CourseNumber = A.CourseNumber
WHERE B.Name = '李華'
AND C.Name = '操作系統(tǒng)';寫(xiě)上面這個(gè)SQL的邏輯也是建立在多表關(guān)聯(lián)查詢(xún)的基礎(chǔ)上,即首先寫(xiě)的SQL是:
SELECT A.Score
FROM dbo.Score AS A
INNER JOIN dbo.Student AS B
ON B.StudentNumber = A.StudentNumber
INNER JOIN dbo.Course AS C
ON C.CourseNumber = A.CourseNumber
WHERE B.Name = '李華'
AND C.Name = '操作系統(tǒng)';通過(guò)關(guān)聯(lián)Student表和Course表查出我們要更新的數(shù)據(jù),然后再將SELECT換成UPDATE,update之后是我們要更新的那個(gè)表名。通過(guò)上面使用表的別名大家應(yīng)該也能看出,雖然update是寫(xiě)在一開(kāi)始的,但是它執(zhí)行的邏輯順序卻是最后。在這里補(bǔ)充一點(diǎn)關(guān)于SQL語(yǔ)句的執(zhí)行順序:
對(duì)于常見(jiàn)的查詢(xún)(SELECT語(yǔ)句),其書(shū)寫(xiě)順序如下:
- SELECT:用于指定要查詢(xún)的列。例如
SELECT column1, column2,你可以選擇一個(gè)或多個(gè)列,也可以使用*來(lái)表示查詢(xún)所有列。 - FROM:指定要從哪個(gè)表中查詢(xún)數(shù)據(jù)。例如
FROM table_name,這是數(shù)據(jù)來(lái)源的表。 - WHERE:用于對(duì)數(shù)據(jù)進(jìn)行篩選,添加條件來(lái)過(guò)濾數(shù)據(jù)。例如
WHERE column1 = value,只有滿(mǎn)足條件的行才會(huì)被返回。 - GROUP BY:用于對(duì)結(jié)果集進(jìn)行分組。例如
GROUP BY column1,通常和聚合函數(shù)(如COUNT()、SUM()等)一起使用,對(duì)每個(gè)分組進(jìn)行操作。 - HAVING:在分組后對(duì)分組進(jìn)行篩選,它和WHERE的區(qū)別在于HAVING是針對(duì)分組后的結(jié)果進(jìn)行篩選,而WHERE是對(duì)原始數(shù)據(jù)進(jìn)行篩選。例如
HAVING COUNT(column1) > 10。 - ORDER BY:用于對(duì)結(jié)果集進(jìn)行排序。例如
ORDER BY column1 ASC(升序,默認(rèn))或ORDER BY column1 DESC(降序),可以指定一個(gè)或多個(gè)列進(jìn)行排序。
但SQL語(yǔ)句的執(zhí)行順序和書(shū)寫(xiě)順序有所不同,主要的執(zhí)行順序是:
- FROM:首先確定數(shù)據(jù)來(lái)源的表,這是整個(gè)查詢(xún)的基礎(chǔ),即要查哪張表。數(shù)據(jù)庫(kù)會(huì)加載指定的表,為后續(xù)的操作提供數(shù)據(jù)源。
- WHERE:在確定了表之后,再對(duì)表中的數(shù)據(jù)進(jìn)行篩選,根據(jù)WHERE子句中的條件過(guò)濾出符合條件的行。這一步可以減少后續(xù)操作的數(shù)據(jù)量,提高查詢(xún)效率。
- GROUP BY:對(duì)WHERE篩選后的結(jié)果集進(jìn)行分組操作。按照指定的列將數(shù)據(jù)分成不同的組,為后續(xù)的聚合操作做準(zhǔn)備。
- 聚合函數(shù)(如在SELECT中使用的COUNT、SUM等):在分組的基礎(chǔ)上,對(duì)每個(gè)分組應(yīng)用聚合函數(shù)進(jìn)行計(jì)算。例如計(jì)算每個(gè)分組的行數(shù)、總和等。
- HAVING:對(duì)分組后的結(jié)果進(jìn)行篩選。這是在聚合函數(shù)計(jì)算之后進(jìn)行的,根據(jù)HAVING子句中的條件過(guò)濾分組。
- SELECT:最后確定要返回的列。此時(shí)已經(jīng)完成了數(shù)據(jù)的篩選、分組和聚合等操作,根據(jù)SELECT子句指定的列從最終的結(jié)果集中提取數(shù)據(jù)。
- ORDER BY:對(duì)最終的結(jié)果集進(jìn)行排序。這是最后一步,根據(jù)指定的列對(duì)結(jié)果進(jìn)行升序或降序排列。
執(zhí)行順序?qū)斫釹QL語(yǔ)句的運(yùn)行非常有幫助!
說(shuō)回更新語(yǔ)句,首先是要查詢(xún)到需要更新的數(shù)據(jù),即確定表--->篩選行--->計(jì)算新值(set語(yǔ)句)--->再更新數(shù)據(jù)。
關(guān)于update更新數(shù)據(jù)的知識(shí),大概就這么多,大家需要掌握:
1.更新單列、更新多列
2.不同的限定條件來(lái)更新數(shù)據(jù)
3.基于表達(dá)式更新
4.表關(guān)聯(lián)更新
最后還想重復(fù)一句,執(zhí)行update的時(shí)候一定要慎重,不要忘記where限定條件,最好先將更新語(yǔ)句中指定的條件用select語(yǔ)句查一遍,確保要更新的數(shù)據(jù)是對(duì)的(后面說(shuō)刪除也是同理),在實(shí)際工作中如果弄錯(cuò)重要數(shù)據(jù),后果很?chē)?yán)重。
到此這篇關(guān)于【SQL】Update更新數(shù)據(jù)的文章就介紹到這了,更多相關(guān)SQL Update更新數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SqlServer備份數(shù)據(jù)庫(kù)的4種方式介紹
這篇文章主要介紹了SqlServer備份數(shù)據(jù)庫(kù)的4種方式介紹,本文講解了用sqlserver的維護(hù)計(jì)劃、通過(guò)腳本+作業(yè)的方式備份數(shù)據(jù)庫(kù)(非xp_cmdshell和xp_cmdshell)、用powershell調(diào)用sqlcmd來(lái)執(zhí)行備份命令幾種方式,需要的朋友可以參考下2015-02-02
SqlServer應(yīng)用之sys.dm_os_waiting_tasks 引發(fā)的疑問(wèn)(下)
這篇文章主要介紹了SqlServer應(yīng)用之sys.dm_os_waiting_tasks 引發(fā)的疑問(wèn)(下) 的相關(guān)資料,需要的朋友可以參考下2015-12-12
sqlserver中distinct的用法(不重復(fù)的記錄)
distinct這個(gè)關(guān)鍵字用來(lái)過(guò)濾掉多余的重復(fù)記錄只保留一條,但往往只用它來(lái)返回不重復(fù)記錄的條數(shù),而不是用它來(lái)返回不重記錄的所有值。其原因是distinct只有用二重循環(huán)查詢(xún)來(lái)解決,而這樣對(duì)于一個(gè)數(shù)據(jù)量非常大的站來(lái)說(shuō),無(wú)疑是會(huì)直接影響到效率的。2010-09-09
SQL 比較一個(gè)集合是否在另一個(gè)集合里存在的方法分享
SQL 比較一個(gè)集合是否在另一個(gè)集合里存在的方法分享,需要的朋友可以參考下。2011-11-11
關(guān)于SQL Server查詢(xún)語(yǔ)句的使用
本篇文章介紹了,關(guān)于SQL Server查詢(xún)語(yǔ)句的使用。需要的朋友參考下2013-04-04
SQL?Server新特性SequenceNumber用法介紹
這篇文章介紹了SQL?Server新特性SequenceNumber的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
SQL Server數(shù)據(jù)庫(kù)按百分比查詢(xún)出表中的記錄數(shù)
這篇文章主要介紹了SQL Server數(shù)據(jù)庫(kù)在一個(gè)表中按百分比查詢(xún)出記錄條數(shù)的方法及代碼示例,需要的朋友可以參考下2015-08-08

