ENGINEERING WORKFLOW · 64
SQL CRUD:不是「操作一個變數」,而是描述要處理哪一組 Rows
SQL 是 declarative query language。你描述想要的 rows/columns/conditions,database planner 決定實際執行策略。最危險的新手錯誤不是語法錯,而是 WHERE scope 寫錯。
Learning outcomes
- 能讀 SELECT/INSERT/UPDATE/DELETE 的資料流。
- 能把 WHERE 視為 operation scope。
- 能分辨 NULL 與一般 value。
- 能在修改資料前先用 SELECT 驗證 target rows。
1. Table / Row / Column
courses
+----+------------+-------+
| id | title | score |
+----+------------+-------+
| 1 | JavaScript | 90 |
| 2 | C++ | 75 |
+----+------------+-------+SQL 多數操作是在集合上工作,而不是逐個 object 手動 loop。
2. SELECT:先精確描述你想看的集合
SELECT id, title, score
FROM courses
WHERE score >= 60
ORDER BY score DESC;先選欄位、來源 table、row predicate、ordering。Production 查詢也要思考資料量與 index。
3. INSERT:建立新 row
INSERT INTO courses
(title, score)
VALUES
('TypeScript', 88);真正可否寫入還受 NOT NULL、CHECK、UNIQUE、FK、RLS 等資料層規則約束。
4. UPDATE / DELETE:WHERE 是 blast radius
UPDATE courses
SET score = 95
WHERE id = 1;
DELETE FROM courses
WHERE id = 2;漏掉 WHERE 可能影響所有 rows。在重要資料上,先把同一 predicate 放進 SELECT,確認 target set。
5. NULL 不是空字串,也不是 0
SELECT *
FROM courses
WHERE score IS NULL;不能用 = NULL 當一般 equality。NULL 表示 missing/unknown,會帶來三值邏輯語意。
Project checkpoint:Course Workspace v3
把 Course Workspace 的資料移到 courses table,完成 list/create/update/delete 四個 operation,所有 destructive operation 先以 SELECT 驗證。
SELECT * FROM courses WHERE id = 42;
UPDATE courses SET score = 92 WHERE id = 42;
SELECT * FROM courses WHERE id = 42;Debug evidence:UPDATE 成功但改錯資料
- 實際 WHERE predicate 是什麼?
- 執行前它會 match 幾 rows?
- 有 transaction/backup/rollback 嗎?
- schema constraint 是否能降低錯誤範圍?
Knowledge check
- SQL 為什麼叫 declarative?
- UPDATE 沒 WHERE 的風險?
- NULL 應用什麼 predicate 判斷?
- 設計一個「先 SELECT、再 UPDATE、再驗證」流程。