2.2 · INSERT、UPDATE、DELETE (DML)
目標: 用資料操縱語言 (DML) 安全修改資料。
INSERT
單行
sql
INSERT INTO Student (student_id, name, class_id, dob)
VALUES (1006, 'Frank', 'F.4B', '2008-04-19');1
2
2
多行
sql
INSERT INTO Student VALUES
(1007, 'Grace', 'F.4A', '2008-06-21'),
(1008, 'Henry', 'F.4B', '2007-12-05');1
2
3
2
3
從 SELECT 插
sql
INSERT INTO StudentArchive
SELECT * FROM Student WHERE dob < '2008-01-01';1
2
2
UPDATE
sql
UPDATE Student
SET class_id = 'F.4A'
WHERE student_id = 1006;1
2
3
2
3
⚠️ 除非有意改每一行,永遠要帶 WHERE。
sql
-- 危險:改每一行!
UPDATE Student SET class_id = 'F.4A';1
2
2
可一次改多列:
sql
UPDATE Student
SET name = 'Alicia Chan', dob = '2007-05-13'
WHERE student_id = 1001;1
2
3
2
3
DELETE
sql
DELETE FROM Student
WHERE student_id = 1008;1
2
2
⚠️ 與 UPDATE 同警告 —— 沒 WHERE 就刪全部。
sql
-- 危險:清空表
DELETE FROM Student;1
2
2
安全 DML 提示
- 先用同
WHERE跑SELECT確認要影響的行。sqlSELECT * FROM Student WHERE student_id = 1008;1 - 包在事務裏便於
ROLLBACK:sqlBEGIN TRANSACTION; DELETE FROM Student WHERE student_id = 1008; -- 檢查影響的行,然後… COMMIT;1
2
3
4 - 先在沙箱測(SQL Books 每賬號一個)。
NULL 處理
sql
INSERT INTO Student (student_id, name) VALUES (1009, 'Ivy');
-- class_id 與 dob 默認 NULL
UPDATE Student
SET dob = NULL
WHERE student_id = 1009;1
2
3
4
5
6
2
3
4
5
6
按 NULL 過濾:
sql
SELECT * FROM Student WHERE dob IS NULL;
SELECT * FROM Student WHERE dob IS NOT NULL;1
2
2
⚠️ WHERE dob = NULL 永不匹配 —— NULL 不等於任何東西。
實例 · 管理課室分配
把 Bob 從 F.4A 移到 F.4B:
sql
UPDATE Student SET class_id = 'F.4B' WHERE student_id = 1002;1
刪除退學學生:
sql
DELETE FROM Student WHERE student_id = 1008;1
為高端書批量加價 10%:
sql
UPDATE Book SET price = price * 1.10 WHERE category = 'Premium';1
學生常見錯誤
- 忘
WHERE改每一行。 - INSERT 列順序與 VALUES 不符。
- 忘了
=對 NULL 不工作(用IS NULL)。 - 在事務鎖阻其他用户時改資料。
考試式題目
題(5 分): 寫 SQL 語句: (a) 插入新學生 id 1010、name 「Jack」、class F.4B、dob 2008-09-10。 (b) 把 Alice (student_id 1001) 的班級改為 F.4B。 (c) 刪除所有 dob 在 2007-01-01 之前的學生。 (d) 把所有目前 NULL 的 email 設為 'unknown@school.edu.hk'。
參考答案:
sql
-- (a)
INSERT INTO Student (student_id, name, class_id, dob)
VALUES (1010, 'Jack', 'F.4B', '2008-09-10');
-- (b)
UPDATE Student SET class_id = 'F.4B' WHERE student_id = 1001;
-- (c)
DELETE FROM Student WHERE dob < '2007-01-01';
-- (d)
UPDATE Student SET email = 'unknown@school.edu.hk' WHERE email IS NULL;1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
關鍵要點
INSERT、UPDATE、DELETE改行。- UPDATE / DELETE 總要帶
WHERE。 - 用事務保安全;沙箱練習。
➡️ 下一節:2.3 SELECT 與 WHERE