← Engineering Workflow

ENGINEERING WORKFLOW · 64

SQL CRUD:不是「操作一個變數」,而是描述要處理哪一組 Rows

SQL 是 declarative query language。你描述想要的 rows/columns/conditions,database planner 決定實際執行策略。最危險的新手錯誤不是語法錯,而是 WHERE scope 寫錯。

Learning outcomes

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 成功但改錯資料

  1. 實際 WHERE predicate 是什麼?
  2. 執行前它會 match 幾 rows?
  3. 有 transaction/backup/rollback 嗎?
  4. schema constraint 是否能降低錯誤範圍?

Knowledge check

  1. SQL 為什麼叫 declarative?
  2. UPDATE 沒 WHERE 的風險?
  3. NULL 應用什麼 predicate 判斷?
  4. 設計一個「先 SELECT、再 UPDATE、再驗證」流程。