Oracle SQL 依功能劃分為四大類,掌握分類邊界是精準授權與審計的基礎:
| 類別 | 縮寫 | 核心動詞 | 主要用途 | 交易行為 |
|---|---|---|---|---|
| 資料查詢語言 | DQL | SELECT | 資料檢索、報表、分析 | 不改變資料,無交易 |
| 資料操作語言 | DML | INSERT, UPDATE, DELETE, MERGE | 資料增刪改 | 需 COMMIT/ROLLBACK |
| 資料定義語言 | DDL | CREATE, ALTER, DROP, TRUNCATE, RENAME | 物件結構管理 | 自動提交 |
| 資料控制語言 | DCL | GRANT, REVOKE | 權限授予與撤銷 | 自動提交 |
INSERT INTO table_name [(column_list)]
VALUES (value_list) | subquery;
COLUMN_ID 順序,可查 USER_TAB_COLUMNS)VALUES (NULL) 或省略欄位(若有預設值)INSERT INTO target SELECT ... FROM source WHERE ...-- 明確指定欄位(推薦,防結構變更失效)
INSERT INTO employees (emp_id, first_name, last_name, hire_date, salary)
VALUES (1001, 'John', 'Doe', SYSDATE, 5000);
-- 多筆插入(10g+ 支援)
INSERT ALL
INTO employees (emp_id, first_name) VALUES (1002, 'Jane')
INTO employees (emp_id, first_name) VALUES (1003, 'Bob')
SELECT * FROM dual;
-- 子查詢插入(歸檔歷史資料)
INSERT INTO employees_archive
SELECT * FROM employees WHERE hire_date < DATE '2020-01-01';
UPDATE table_name
SET column1 = expr1, column2 = expr2, ...
[WHERE condition];
SELECT 驗證SET col = (SELECT ...) 子查詢必須回傳單一值UPDATE t1 SET t1.col = (SELECT t2.val FROM t2 WHERE t2.id = t1.id)-- 單欄更新
UPDATE employees SET salary = salary * 1.1 WHERE dept_id = 10;
-- 多欄關聯更新
UPDATE employees e
SET (e.salary, e.bonus) = (
SELECT AVG(salary)*1.2, 500 FROM employees WHERE dept_id = e.dept_id
)
WHERE EXISTS (SELECT 1 FROM employees WHERE dept_id = e.dept_id);
DELETE FROM table_name [WHERE condition];
TRUNCATE(DDL,不可回滾)ON DELETE CASCADE-- 條件刪除
DELETE FROM employees WHERE hire_date < DATE '2010-01-01';
-- 關聯刪除(EXISTS 效能優於 IN)
DELETE FROM departments d
WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.dept_id = d.dept_id);
在查詢時對選取列加排他鎖,防止併發修改:
SELECT * FROM employees WHERE dept_id = 10 FOR UPDATE [NOWAIT | WAIT n | SKIP LOCKED];
NOWAIT:鎖被佔用立即報錯WAIT n:等待 n 秒SKIP LOCKED(11g+):跳過已鎖定列LOCK TABLE table_name IN lock_mode [MODE] [NOWAIT];
ROW SHARE、ROW EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVEEXCLUSIVE 鎖salary + bonus 若 bonus 為 NULL → NULLsalary + NVL(bonus, 0) 或 COALESCE(bonus, 0)col = NULL 永遠為 FALSE,必須用 col IS NULLFORALL (PL/SQL) 或分批 COMMIT 避免 UNDO 爆滿CTAS (CREATE TABLE AS SELECT) 保留資料再 TRUNCATEMERGE (UPSERT) 替代分離 INSERT/UPDATE結語:精通 DML 四大核心語句與 NULL 處理,是資料庫開發與維護的基本功。建議搭配 EXPLAIN PLAN 與 AUTOTRACE 驗證執行計畫,寫出高效能 SQL。