本文介紹如何使用 UPDATE 和 DELETE 語句處理表中的數據,還介紹了為什麼 WHERE 子句對 UPDATE 和 DELETE 語句很重要。 一、更新數據 更新(修改)表中的數據,可以使用 UPDATE 語句。有兩種使用 UPDATE 的方式: 更新表中的特定行; 更新表中的所有行。 下麵 ...
目錄
本文介紹如何使用 UPDATE
和 DELETE
語句處理表中的數據,還介紹了為什麼 WHERE
子句對 UPDATE
和 DELETE
語句很重要。
一、更新數據
更新(修改)表中的數據,可以使用 UPDATE
語句。有兩種使用 UPDATE
的方式:
- 更新表中的特定行;
- 更新表中的所有行。
下麵分別介紹。
註意:不要省略
WHERE
子句在使用
UPDATE
時一定要細心。因為稍不註意,就會更新表中的所有行。使用這條語句前,請完整地閱讀本節。
提示:
UPDATE
與安全在客戶端/伺服器的 DBMS 中,使用
UPDATE
語句可能需要特殊的安全許可權。在你使用UPDATE
前,應該保證自己有足夠的安全許可權。
使用 UPDATE
語句非常容易,甚至可以說太容易了。基本的 UPDATE
語句由三部分組成,分別是:
- 要更新的表;
- 列名和它們的新值;
- 確定要更新哪些行的過濾條件。
舉一個簡單例子。客戶 1000000005
現在有了電子郵件地址,因此他的記錄需要更新,語句如下:
UPDATE Customers
SET cust_email = '[email protected]'
WHERE cust_id = 1000000005;
UPDATE
語句總是以要更新的表名開始。在這個例子中,要更新的表名為 Customers
。SET
命令用來將新值賦給被更新的列。在這裡,SET
子句設置 cust_email
列為指定的值:
SET cust_email = '[email protected]'
UPDATE
語句以 WHERE
子句結束,它告訴 DBMS 更新哪一行。沒有 WHERE
子句,DBMS 將會用這個電子郵件地址更新 Customers
表中的所有行,這不是我們希望的。
更新多個列的語法稍有不同:
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = '[email protected]'
WHERE cust_id = 1000000006;
在更新多個列時,只需要使用一條 SET
命令,每個“列=值”對之間用逗號分隔(最後一列之後不用逗號)。在此例子中,更新顧客 1000000006
的 cust_contact
和 cust_email
列。
提示:在
UPDATE
語句中使用子查詢
UPDATE
語句中可以使用子查詢,使得能用SELECT
語句檢索出的數據更新列數據。關於子查詢及使用的更多內容,請參閱 SQL 如何使用子查詢。
提示:
FROM
關鍵字有的 SQL 實現支持在
UPDATE
語句中使用FROM
子句,用一個表的數據更新另一個表的行。如想知道你的 DBMS 是否支持這個特性,請參閱它的文檔。
要刪除某個列的值,可設置它為 NULL
(假如表定義允許 NULL
值)。如下進行:
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = 1000000005;
其中 NULL
用來去除 cust_email
列中的值。這與保存空字元串很不同(空字元串用 ''
表示,是一個值),而 NULL
表示沒有值。
二、刪除數據
從一個表中刪除(去掉)數據,使用 DELETE
語句。有兩種使用 DELETE
的方式:
- 從表中刪除特定的行;
- 從表中刪除所有行。
下麵分別介紹。
註意:不要省略
WHERE
子句在使用
DELETE
時一定要細心。因為稍不註意,就會錯誤地刪除表中所有行。在使用這條語句前,請完整地閱讀本節。
提示:
DELETE
與安全在客戶端/伺服器的 DBMS 中,使用
DELETE
語句可能需要特殊的安全許可權。在你使用DELETE
前,應該保證自己有足夠的安全許可權。
前面說過,UPDATE
非常容易使用,而 DELETE
更容易使用。
下麵的語句從 Customers
表中刪除一行:
DELETE FROM Customers
WHERE cust_id = 1000000006;
這條語句很容易理解。DELETE FROM
要求指定從中刪除數據的表名,WHERE
子句過濾要刪除的行。
在這個例子中,只刪除顧客 1000000006
。如果省略 WHERE
子句,它將刪除表中每個顧客。
提示:友好的外鍵
如何使用 SQL INNER JOIN 聯結兩個或多個表 介紹了聯結,簡單聯結兩個表只需要這兩個表中的公用欄位。
也可以讓 DBMS 通過使用外鍵來嚴格實施關係(這些定義在 學習 SQL 所用到的樣例表腳本 中)。存在外鍵時,DBMS 使用它們實施引用完整性。
例如要向
Products
表中插入一個新產品,DBMS 不允許通過未知的供應商id
插入它,因為vend_id
列是作為外鍵連接到Vendors
表的。那麼,這與
DELETE
有什麼關係呢?使用外鍵確保引用完整性的一個好處是,DBMS 通常可以防止刪除某個關係需要用到的行。例如,要從
Products
表中刪除一個產品,而這個產品用在OrderItems
的已有訂單中,那麼DELETE
語句將拋出錯誤並中止。這是總要定義外鍵的另一個理由。
提示:
FROM
關鍵字在某些 SQL 實現中,跟在
DELETE
後的關鍵字FROM
是可選的。但是即使不需要,也最好提供這個關鍵字。這樣做將保證 SQL 代碼在 DBMS 之間可移植。
DELETE
不需要列名或通配符。DELETE
刪除整行而不是刪除列。要刪除指定的列,請使用 UPDATE
語句。
說明:刪除表的內容而不是表
DELETE
語句從表中刪除行,甚至是刪除表中所有行。但是,DELETE
不刪除表本身。
提示:更快的刪除
如果想從表中刪除所有行,不要使用
DELETE
。可使用TRUNCATE TABLE
語句,它完成相同的工作,而速度更快(因為不記錄數據的變動)。
三、更新和刪除的指導原則
前兩節使用的 UPDATE
和 DELETE
語句都有 WHERE
子句,這樣做的理由很充分。
如果省略了 WHERE
子句,則 UPDATE
或 DELETE
將被應用到表中所有的行。
換句話說,如果執行 UPDATE
而不帶 WHERE
子句,則表中每一行都將用新值更新。類似地,如果執行 DELETE
語句而不帶 WHERE
子句,表的所有數據都將被刪除。
下麵是許多 SQL 程式員使用 UPDATE
或 DELETE
時所遵循的重要原則。
- 除非確實打算更新和刪除每一行,否則絕對不要使用不帶
WHERE
子句的UPDATE
或DELETE
語句。 - 保證每個表都有主鍵(如果忘記這個內容,請參閱 如何使用 SQL INNER JOIN 聯結兩個或多個表),儘可能像
WHERE
子句那樣使用它(可以指定各主鍵、多個值或值的範圍)。 - 在
UPDATE
或DELETE
語句使用WHERE
子句前,應該先用SELECT
進行測試,保證它過濾的是正確的記錄,以防編寫的WHERE
子句不正確。 - 使用強制實施引用完整性的資料庫(關於這個內容,請參閱 如何使用 SQL INNER JOIN 聯結兩個或多個表),這樣 DBMS 將不允許刪除其數據與其他表相關聯的行。
- 有的 DBMS 允許資料庫管理員施加約束,防止執行不帶
WHERE
子句的UPDATE
或DELETE
語句。如果所採用的 DBMS 支持這個特性,應該使用它。
若是 SQL 沒有撤銷(undo)按鈕,應該非常小心地使用 UPDATE
和 DELETE
,否則你會發現自己更新或刪除了錯誤的數據。
四、小結
本文介紹瞭如何使用 UPDATE
和 DELETE
語句處理表中的數據。
我們學習了這些語句的語法,知道了它們可能存在的危險,瞭解了為什麼 WHERE
子句對 UPDATE
和 DELETE
語句很重要,還學習了為保證數據安全而應該遵循的一些指導原則。
原文鏈接:https://www.developerastrid.com/sql/sql-update-delete/
(完)