Update是SQL語句中DML類(DataManipulation Language,數(shù)據(jù)操縱語言)中的一個指令,用于更新(修改)表中原有數(shù)據(jù)2。
語句概述
Update是SQL語句中DML類(Data Manipulation Language,數(shù)據(jù)操縱語言)中的一個指令,用于更新(修改)表中原有數(shù)據(jù)2?;緯鴮懸?guī)則
(1)SQL 語句使用分號(;)結尾;
(2)Update作為關鍵字不區(qū)分大小寫。
語法結構
UPDATE 表名稱
SET 列名稱 = 新值, 列名稱2 = 新值2,...
WHERE 條件;
其中,表名稱是需要更新數(shù)據(jù)的表的名稱;列名稱= 新值部分指定了要更新的列及其新值;WHERE條件用于指定哪些記錄需要被更新。如果省略WHERE子句,所有記錄將被更新。
SQL的UPDATE語句通過指定表、列及其新值以及適用的條件來實現(xiàn)對數(shù)據(jù)庫表中數(shù)據(jù)的更新操作。使用WHERE子句
更新部分數(shù)據(jù)行時可以使用WHERE來指定更新對象的條件。通過WHERE
子句指定更新對象的UPDATE語句稱為搜索型UPDATE語句1。
更新操作
(1)更新表中的特定行3
UPDATE語句用于修改表中的數(shù)據(jù),而WHERE子句則用于指定哪些行需要被更新。
語法說明:
UPDATE< 表名 >
SET< 列名 = 表達式 >[,…n]
WHERE< 查詢條件 >
具體說明:
1)< 表名 > 指定需要修改數(shù)據(jù)的表的名稱。
2)< 列名 = 表達式 > 指定要修改的列名和相應的值,表達式值的數(shù)據(jù)類型要與對應列的數(shù)據(jù)類型一樣。
3)WHERE子句指定表中修改數(shù)據(jù)所要滿足的條件。如果WHERE子句省略,則表示要修改表中的所有行。
例如2:
客戶1000000005現(xiàn)在有了電子郵件地址,因此他的記錄需要更新。
語句如下:
輸入▼
UPDATE Customers
SET cust_email = ‘kim@thetoystore.com’
WHERE cust_id = ‘1000000005’;
UPDATE語句總是以要更新的表名開始。在這個例子中,要更新的表名為Customers。SET命令用來將新值賦給被更新的列。在這里,SET子句設置cust_email列為指定的值:
SET cust_email = ‘kim@thetoystore.com’ UPDATE語句以WHERE子句結束,它告訴DBMS 更新哪一行。沒有WHERE子句,DBMS將會用這個電子郵件地址更新Customers表中的所有行。
(2)更新表中的所有行1
省略WHERE子句,所有記錄將被更新。
語法說明:
UPDATE <表名>
SET <列名> = <表達式>;
(3)多列更新1
同時更新多列時,可以在UPDATE語句的SET子句中,使用逗號分隔更新對象的多個列1。
語法說明:
UPDATE< 表名 >
SET< 列名1 = 表達式1,列名2=表達式2,…… >
WHERE< 查詢條件 >
例如2:
輸入▼
UPDATE Customers
SET cust_contact = 'Sam Roberts', cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';
在更新多個列時,只需要使用一條SET命令,每 個“列=值”對之間用逗號分隔(最后一列之后不用逗號)。在此例子中,更新顧客1000000006的 cust_contact和cust_email列。
(4)使用NULL進行更新
使用 UPDATE 也可以將列更新為 NULL(該更新俗稱為 NULL 清空)。此時只需要將賦值表達式右邊的值直接寫為 NULL 即可。和 INSERT 語句一樣,UPDATE 語句也可以將 NULL 作為一個值來使用。但是,只有未設置 NOT NULL 約束和主鍵約束的列才可以清空為NULL。如果將設置了上述約束的列更新為NULL,就會出錯。要刪除某個列的值,可設置它為NULL(假如表定義允許NULL值)1。
語法說明:
UPDATE< 表名 >
SET< 列名 = NULL,…… >
WHERE< 查詢條件 >
例如:
輸入▼
UPDATE Customers SET cust_email = NULL WHERE cust_id = ‘1000000005’
其中NULL用來去除cust_email列中的值。這與保存空字符串不同(空字符串用‘’表示,是一個值),而NULL表示沒有值2。
(5)FROM關鍵字在有些數(shù)據(jù)庫系統(tǒng)中,SQL實現(xiàn)支持在UPDATE語句中使用FROM子句,用一個表的數(shù)據(jù)更新另一個表的行。如想知道是否支持該特性需查閱數(shù)據(jù)庫系統(tǒng)文檔2。
(6)update語句中使用子查詢2
在有些數(shù)據(jù)庫系統(tǒng)中,update語句中可以使用子查詢,使得能用SELECT 語句檢索出的數(shù)據(jù)更新列數(shù)據(jù)。
子查詢是嵌套在另一個查詢中的查詢,通常用在WHERE子句中,但也可以用于SET子句。
例如:
1)在WHERE子句中使用子查詢
假設有一個sales表,將那些銷售額超過所有銷售人員平均銷售額的記錄的bonus字段更新為100。
UPDATE sales
SET bonus = 100
WHERE sales_amount > (SELECTAVG(sales_amount) FROM sales);
在這個例子中,子查詢計算sales表中所有記錄的sales_amount的平均值,然后WHERE子句根據(jù)這個平均值來更新記錄。
2)在SET子句中使用子查詢
假設有兩個表:employees和departments。根據(jù)departments表中的信息更新employees表中的salary字段。
UPDATE employees
SET salary = salary * (SELECTdepartment_increase FROM departments WHERE departments.department_id =employees.department_id)
WHERE EXISTS (SELECT 1 FROMdepartments WHERE departments.department_id = employees.department_id);
在這個例子中,department_increase是departments表中的一個字段,表示每個部門的工資增長百分比。SET子句中的子查詢根據(jù)department_id字段來更新employees表中的salary字段。
(7)在SQL UPDATE語句中使用JOIN來更新表中的數(shù)據(jù)
當需要根據(jù)一張或多張表的數(shù)據(jù)來更新另一張表的數(shù)據(jù)時,可以使用UPDATE語句結合JOIN操作。
1)選擇合適的JOIN類型:INNER JOIN(內(nèi)連接)、LEFT JOIN(左連接)、RIGHT JOIN(右連接)。
2)編寫UPDATE語句并包含JOIN:首先,確定要更新的目標表和源表,并使用別名來簡化查詢。使用ON子句指定JOIN條件。使用SET子句來定義要更新的字段及其新值。
假設我們有一個客戶表(Customers)和訂單表(Orders),我們想要更新客戶的姓氏為“Smith”,但僅當他們的訂單包含鍵盤時才進行更新。
UPDATE Customers C
JOIN Orders O ONC.customer_id = O.customer_id
SET C.last_name = 'Smith'
WHERE O.item = 'Keyboard';
在這個例子中,通過Customers和Orders表之間的連接,找到了所有相關聯(lián)的客戶,并將他們的姓氏更新為“Smith”。
如果需要在一個表內(nèi)更新數(shù)據(jù),可以使用自連接。例如,更新每個員工的上級姓名:
UPDATE employee AS t1
JOIN employee AS t2 ON t1.經(jīng)理_id = t2.員工_id
SET t1.經(jīng)理_姓名= t2.姓名;
這個語句的目的是更新employee表中每個員工的“經(jīng)理_姓名”字段,使其與對應經(jīng)理的“姓名”字段相匹配。使用了自連接(self-join),即同一個表employee通過兩個不同的別名t1和t2來表示,t1和t2代表同一個表employee的不同實例或行集,t1代表當前正在處理的員工,t2代表當前員工的上級,通過ON子句中的條件t1.經(jīng)理_id = t2.員工_id,確定了t1中的每一行與t2中的哪一行相關聯(lián)。
3)在某些數(shù)據(jù)庫系統(tǒng)中(如SQL Server),可能需要使用FROM子句和表別名來明確指定源表。確保JOIN條件正確且高效,以避免性能問題。
操作舉例說明
例子1:
以Product(商品)表為例
|| || Product表
1)更新表中的所有行:將登記日期全部更新為“2009-10-10”
UPDATEProduct
SETregist_date = '2009-10-10';
|| || 結果
此時,連登記日期原本為 NULL的數(shù)據(jù)行(運動 T 恤)的值也更新為2009-10-10了。
2)更新特定行
將商品種類(product_type)為廚房用具的記錄的銷售單價(sale_price)更新為原來的 10 倍
UPDATEProduct
SETsale_price = sale_price * 10
WHEREproduct_type = '廚房用具';
|| || 結果
該語句通過WHERE 子句中的“product_type = '廚房用具'”條件,將更新對象限定為 3 行。然后通過 SET 子句中的表達式sale_price * 10,將原來的單價擴大了 10 倍。SET 子句中賦值表達式的右邊不僅可以是單純的值,還可以是包含列的表達式。
3)多列更新
將銷售單價(sale_price)更新為原來的 10 倍,同時將進貨單(purchase_price)更新為原來的一半
UPDATEProduct
SETsale_price = sale_price * 10, purchase_price = purchase_price / 2
WHEREproduct_type = '廚房用具';
|| || 結果