# 命令列
mysql -h localhost -u root -p
# -h 主機(本機可省略),-u 用戶,-p 密碼交互輸入
成功後進入 mysql> 提示符。
| 操作 | SQL |
|---|---|
| 建庫 | CREATE DATABASE db_name CHARSET utf8mb4; |
| 刪庫 | DROP DATABASE db_name; |
| 查庫 | SHOW DATABASES; |
| 選庫 | USE db_name; |
| 查表 | SHOW TABLES; |
| 表結構 | DESC tbl_name; / SHOW CREATE TABLE tbl_name; |
| 刪表 | DROP TABLE tbl_name; |
| 多表刪除 | DELETE t1, t2 FROM t1 JOIN t2 ON ... WHERE ... |
| 多表更新 | UPDATE t1 JOIN t2 ON ... SET t1.c=expr, t2.c=expr WHERE ... |
SELECT DISTINCT dept_id FROM employee;
SELECT * FROM employee ORDER BY hire_date DESC, salary ASC LIMIT 10 OFFSET 20;
-- LIMIT offset, row_count(MySQL)或 LIMIT row_count OFFSET offset
| 函數 | 說明 |
|---|---|
COUNT(*) | 行數(含 NULL) |
SUM(col) | 求和 |
AVG(col) | 平均值 |
MAX(col) | 最大值 |
MIN(col) | 最小值 |
-- 按課程統計選課人數
SELECT course_id, COUNT(*) AS cnt FROM sc GROUP BY course_id;
-- 按年級統計並顯示總計
SELECT grade, COUNT(*) FROM student GROUP BY grade WITH ROLLUP;
-- HAVING 過濾聚合後結果(年齡 ≥ 20 的年級)
SELECT grade, COUNT(*) FROM student WHERE age >= 20 GROUP BY grade HAVING COUNT(*) > 5;
WHERE vs HAVING:WHERE 過濾原始行(聚合前),HAVING 過濾分組結果(聚合後)。能用 WHERE 先過濾,減少聚合輸入,提升性能。
SELECT s.name, c.course_name
FROM student s
JOIN sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id;
僅返回雙方匹配的行。
| 類型 | 保留側 | 語法 |
|---|---|---|
| LEFT JOIN | 左表所有行 | FROM a LEFT JOIN b ON ... |
| RIGHT JOIN | 右表所有行 | FROM a RIGHT JOIN b ON ... |
-- 左連接:所有學生(含未選課)
SELECT s.name, c.course_name
FROM student s
LEFT JOIN sc ON s.id = sc.student_id
LEFT JOIN course c ON sc.course_id = c.id;
-- 查選了「數學」的學生
SELECT * FROM student WHERE id IN (SELECT student_id FROM sc WHERE course_id = (SELECT id FROM course WHERE name='數學'));
-- 等價內連接(通常效率更高)
SELECT s.* FROM student s
JOIN sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id
WHERE c.name = '數學';
優化建議:邏輯允許時優先改寫為 內連接,MySQL 優化器對 JOIN 執行計劃更成熟。
| 操作符 | 去重 | 性能 |
|---|---|---|
UNION | 是(排序去重) | 較慢 |
UNION ALL | 否(直接拼接) | 極快 |
-- 正確:列數、類型一致
SELECT id, name FROM student_2023
UNION ALL
SELECT id, name FROM student_2024;
-- 錯誤:列數不匹配
SELECT id, name FROM student
UNION
SELECT id, name, age FROM teacher; -- ERROR 1222
EXISTS 子查詢外層用小結果集。EXPLAIN 看 Using index。WHERE id > last_id LIMIT n(游標分頁)。utf8mb4,避免隱式轉換導致索引失效。掌握 DDL/DML 基礎 → 聚合分組 → 內外連接 → 子查詢改 JOIN → UNION ALL 優先 這條主線,即可應對 90% 業務查詢場景。進階請深入 EXPLAIN 執行計劃、索引設計(B+ 樹最左前綴)、鎖機制(MVCC/Next-Key Lock)與慢查詢分析(pt-query-digest)。