CREATE TABLE student (
stu_id INT PRIMARY KEY,
stu_name CHAR(10) NOT NULL,
stu_age SMALLINT UNSIGNED NOT NULL,
stu_sex CHAR(2) NOT NULL
);
CREATE TABLE grade (
stu_id INT NOT NULL,
stu_score INT,
FOREIGN KEY (stu_id) REFERENCES student(stu_id)
);
SELECT 屬性列表
FROM 表名/視圖
[WHERE 條件]
[GROUP BY 分組列 [HAVING 分組條件]]
[ORDER BY 排序列 [ASC|DESC]]
[LIMIT 偏移, 行數]
SELECT * FROM student;
| 類別 | 運算符 | 示例 |
|---|---|---|
| 比較 | > < = != (<>) >= <= | WHERE stu_age > 13 |
| 集合 | IN / NOT IN | WHERE stu_age IN (11,12) |
| 範圍 | BETWEEN ... AND ... | WHERE stu_age BETWEEN 13 AND 15 |
| 邏輯 | AND / OR / NOT | WHERE stu_id < 2005 OR stu_id > 2015 |
| 模糊 | LIKE / NOT LIKE | WHERE stu_name LIKE '阿%' |
| 空值 | IS NULL / IS NOT NULL | WHERE stu_score IS NULL |
%:匹配任意長度字符(含 0 長度)_:匹配單個字符(中文佔 2-3 字節,需多個 _)| 函數 | 含義 | 示例 |
|---|---|---|
| MAX() | 最大值 | SELECT MAX(emp_salary) FROM employees GROUP BY emp_dep |
| MIN() | 最小值 | SELECT MIN(emp_salary) FROM employees GROUP BY emp_dep |
| SUM() | 求和 | SELECT SUM(emp_salary) FROM employees GROUP BY emp_dep |
| AVG() | 平均值 | SELECT AVG(emp_salary) FROM employees GROUP BY emp_dep |
| COUNT() | 行數 | SELECT COUNT(*) FROM employees WHERE emp_salary >= 5000 GROUP BY emp_dep |
SELECT emp_dep, AVG(emp_salary), GROUP_CONCAT(emp_name)
FROM employees
GROUP BY emp_dep
HAVING AVG(emp_salary) >= 6000;
WHERE vs HAVING:WHERE 過濾行(聚合前),HAVING 過濾組(聚合後)。
-- 隱式
SELECT s.stu_id, s.stu_name, g.stu_score
FROM student s, grade g
WHERE s.stu_id = g.stu_id AND g.stu_score >= 90;
-- 顯式 (推薦)
SELECT s.stu_id, s.stu_name, g.stu_score
FROM student s
INNER JOIN grade g ON s.stu_id = g.stu_id
WHERE g.stu_score >= 90;
-- 左連接:學生表全保留,成績無則 NULL
SELECT s.stu_id, s.stu_name, g.stu_score
FROM student s
LEFT JOIN grade g ON s.stu_id = g.stu_id;
-- 右連接:成績表全保留
SELECT s.stu_id, s.stu_name, g.stu_score
FROM student s
RIGHT JOIN grade g ON s.stu_id = g.stu_id;
SELECT * FROM student
WHERE stu_id IN (SELECT stu_id FROM grade WHERE stu_score > 85);
SELECT * FROM student
WHERE EXISTS (SELECT 1 FROM grade WHERE stu_score >= 100);
若子查詢返回任意行,EXISTS 為真。
-- ANY: 滿足任一值
SELECT * FROM student
WHERE stu_id > ANY (SELECT stu_id FROM grade WHERE stu_score < 67);
-- ALL: 滿足所有值
SELECT * FROM student
WHERE stu_id > ALL (SELECT stu_id FROM grade WHERE stu_score < 67);
SELECT stu_id FROM student WHERE stu_age < 13
UNION
SELECT stu_id FROM student WHERE stu_sex = '女';
-- UNION 去重,UNION ALL 保留重複
ORDER BY stu_score DESC -- 降序
ORDER BY stu_score ASC -- 升序(默認)
ORDER BY RAND() -- 隨機(大表慎用)
LIMIT 5 -- 前5行
LIMIT 10, 5 -- 跳過10行取5行 (第11-15行)
-- 列別名
SELECT stu_id AS '學號', stu_score AS '分數' FROM grade;
-- 表別名
SELECT s.stu_id, s.stu_name, g.stu_score
FROM student s, grade g
WHERE s.stu_id = g.stu_id;
| 模式 | 含義 | 示例 |
|---|---|---|
| ^ | 行首 | WHERE name REGEXP '^阿' |
| $ | 行尾 | WHERE name REGEXP '[0-9]$' |
| . | 任意單字符 | WHERE name REGEXP '^w....[0-9]$' |
| [...] | 字符集合 | WHERE name REGEXP '[abc]' |
| [^...] | 排除字符集合 | WHERE name REGEXP '[^0-9]' |
| {m,n} | 出現 m 到 n 次 | WHERE name REGEXP 'o{2}' |
| + | 至少 1 次 | WHERE name REGEXP '(fa)+' |
| * | 0 次或多次 | WHERE name REGEXP 'ab*c' |
| | | 或 | WHERE name REGEXP 'cat|dog' |
-- 以數字開頭
SELECT * FROM student WHERE stu_name REGEXP '^[0-9]';
-- 包含字母和數字
SELECT * FROM student WHERE stu_name REGEXP '[a-zA-Z0-9]';
-- 連續兩個 o
SELECT * FROM student WHERE stu_name REGEXP 'o{2}';
EXPLAIN 分析執行計劃,關注 type、key、rows、ExtraSELECT *,只查所需列LIKE '%keyword' 導致全表掃描,全文檢索用全文索引或 ESREGEXP 不走普通索引,大表慎用本文涵蓋 MySQL 查詢 90% 以上常用場景,建議收藏作為速查手冊,實戰中結合 EXPLAIN 與慢查詢日誌持續優化。