4.1 UPDATE SET語句
如果您需要更改表中的現有記錄,那麼為此我們使用運算符UPDATE
。
一方面,運算符UPDATE
類似於運算符INSERT
,因為我們需要為列指定新值。另一方面,在 operator 上SELECT
,因為它允許您立即處理數據組。
重要的!運算符的目的UPDATE
不是改變表中某一行的數據,而是改變滿足一定條件的所有行的數據。而且如果你犯了一個小錯誤,你很容易丟失表中的所有數據。
請求的一般視圖:
UPDATE table SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE condition;
讓我們編寫一個查詢,將所有員工的薪水增加100。我們的查詢將如下所示:
UPDATE employee SET
salary = salary+100;
而且現在對於每個工資低於50K的,我們也會加20%。請求示例:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
當然,我們會把主任的工資提高2倍,沒有他怎麼行:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 複雜的數據修改場景
如果您決定同時更改多個表中的數據,或者當您更改一個表中的數據時,您需要用另一個表中的數據填充它,或者只是在更改第一個表的過程中以某種方式使用另一個表中的數據,然後驚喜等待著我們。
讓我們嘗試更改 employee 表中存在的 user 表中所有用戶的級別。為簡單起見,我們將按名稱檢查用戶的重合性。
我們想如何編寫此查詢:
UPDATE user SET
level = 80,
WHERE user . name IN ( list of names from employee table );
好吧,讓我們將員工表中的姓名列表添加到此查詢中:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
有趣的!用於獲取名稱的 SQL 查詢本身比任務描述還要短。SQL 的創造者沒有白吃麵包。
被迫讓你心煩意亂——這種方法行不通. 首先你需要加入這些表,它看起來像這樣:
UPDATE table 1, table 2 SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE table 1.id = table 2.ref_id;
讓我們讓它更難一點。只有薪水超過 50k 的優秀員工才需要將級別設置為 80。完整的解決方案將如下所示:
UPDATE user, good_employees SET
user.level = 80
WHERE user.name = good_employees.name;
這樣的表連接實際上是INNER JOIN
,因此最終只會保留在第二個表中按名稱匹配的用戶。
但是我們仍然需要以某種方式選擇優秀的員工,所以讓我們添加更多代碼:
SELECT * FROM employee WHERE salary >= 50000
現在我們在最終查詢中替換此表:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
現在忍受它。