DDL (Data Definition Language):CREATE/ALTER/DROP TABLE 定義結構,不處理數據行。
DML (Data Manipulation Language):INSERT/SELECT/UPDATE/DELETE 操作具體數據,是日常開發 90%+ 的工作內容。
CREATE TABLE EMPLOYEES (
emp_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
dept_id INT,
salary DECIMAL(10,2),
hire_date DATE
);
INSERT INTO EMPLOYEES (emp_id, name, dept_id, salary, hire_date)
VALUES (101, '張三', 10, 8500.00, '2020-03-15');
INSERT INTO EMPLOYEES (emp_id, name, hire_date)
VALUES (102, '李四', '2021-07-01');
INSERT INTO EMPLOYEES (emp_id, name, dept_id, salary, hire_date)
VALUES
(103, '王五', 20, 9200.00, '2019-11-01'),
(104, '趙六', 20, 8800.00, '2022-01-10'),
(105, '孫七', 30, 12000.00, '2018-05-20');
INSERT INTO EMPLOYEES_ARCHIVE
SELECT * FROM EMPLOYEES WHERE hire_date < '2015-01-01';
SELECT [DISTINCT] select_list
FROM table_references
[WHERE where_condition]
[GROUP BY group_list]
[HAVING having_condition]
[ORDER BY order_list [ASC|DESC]]
[LIMIT [offset,] row_count];
SELECT emp_id AS id, name AS employee_name FROM EMPLOYEES;SELECT name, salary * 12 AS annual_salary FROM EMPLOYEES;SELECT dept_id, AVG(salary) FROM EMPLOYEES GROUP BY dept_id HAVING AVG(salary) > 9000;SELECT * FROM EMPLOYEES ORDER BY hire_date DESC LIMIT 10 OFFSET 20;UPDATE EMPLOYEES
SET salary = salary * 1.1, dept_id = 30
WHERE emp_id = 101;
UPDATE EMPLOYEES e
JOIN DEPARTMENTS d ON e.dept_id = d.dept_id
SET e.salary = e.salary * 1.05
WHERE d.name = '研發部';
DELETE FROM EMPLOYEES WHERE dept_id = 99;
DELETE e FROM EMPLOYEES e
JOIN DEPARTMENTS d ON e.dept_id = d.dept_id
WHERE d.status = 'closed';
TRUNCATE TABLE EMPLOYEES;
| 類型 | 語法 | 語義 | 結果行數 |
|---|---|---|---|
| 內連接 | INNER JOIN / JOIN | 僅返回匹配行 | ≤ 兩表行數最小值 |
| 左外連接 | LEFT [OUTER] JOIN | 左表全保留,右表無匹配填 NULL | = 左表行數 |
| 右外連接 | RIGHT [OUTER] JOIN | 右表全保留 | = 右表行數 |
| 全外連接 | FULL [OUTER] JOIN | 雙表全保留(MySQL 不支持,用 UNION 模擬) | ≥ 兩表行數最大值 |
| 交叉連接 | CROSS JOIN | 笛卡爾積(無 ON 條件) | = 兩表行數乘積 |
FROM table1
INNER JOIN table2 ON table1.col = table2.col
LEFT JOIN table3 ON table1.col = table3.col
CROSS JOIN table4;
推薦:連接條件放 ON,過濾條件放 WHERE,語義清晰、優化器友好。
TEXT、NTEXT、IMAGE(SQL Server)/ BLOB/TEXT(MySQL)不可直接作連接鍵。
變通:ON DATALENGTH(t1.blob_col) = DATALENGTH(t2.blob_col) 或比較哈希值。
NULL 比較結果為 UNKNOWN。WHERE col = NULL 永遠不返回行 → 必須用 IS NULL。NOT (col = NULL) 也不返回行 → 用 IS NOT NULL。| 操作 | 必做 | 禁忌 |
|---|---|---|
| INSERT | 顯式列名、批量提交、事務包裹 | 隱式列順序依賴、單行循環提交 |
| SELECT | 避免 SELECT *、善用覆蓋索引、LIMIT 分頁 | 無 WHERE 全表掃描、SELECT * 過網絡 |
| UPDATE | WHERE 精確鎖定、受影響行數預估、事務 | 無 WHERE、大事務長鎖定、子查詢未驗證 |
| DELETE | WHERE 精確、先 SELECT 驗證、歸檔備份 | 無 WHERE、直接刪大表、無外鍵級聯評估 |
掌握 INSERT/SELECT/UPDATE/DELETE 四大 DML 及連接查詢,是 SQL 進階的門檻。記住:顯式優於隱式、集合優於迭代、約束優於信任。每次寫 DML 前,先在腦中跑一遍「影響多少行?會鎖住什麼?索引能用上嗎?有無事務保護?」。