核心 SELECT 語法骨架
SELECT 屬性列表
FROM 表/視圖列表
[WHERE 條件]
[GROUP BY 屬性 [HAVING 條件]]
[ORDER BY 屬性 [ASC|DESC]]
[LIMIT [偏移,] 行數]
一、單表查詢必會技巧
1. 全字段 vs 指定字段
SELECT * FROM product; -- 全字段(調試用)
SELECT id, name, price FROM product; -- 生產環境:只取所需
2. WHERE 條件構建大全
| 類型 | 操作符 | 範例 |
| 比較 | =, <>, !=, <, <=, >, >= | WHERE price > 100 |
| 範圍 | BETWEEN ... AND ..., NOT BETWEEN | WHERE age BETWEEN 18 AND 30 |
| 集合 | IN (...), NOT IN (...) | WHERE status IN (1,2,3) |
| 模糊 | LIKE, NOT LIKE | WHERE name LIKE '張%' |
| 空值 | IS NULL, IS NOT NULL | WHERE phone IS NULL |
| 邏輯 | AND, OR, NOT | WHERE age>18 AND status=1 |
3. LIKE 通配符精通
%:匹配任意長度(含 0)字符
_:匹配單個字符
LIKE '北京%' → 以「北京」開頭
LIKE 'ar_c' → 4 字符、前綴 ar、後綴 c
4. 去重 DISTINCT
SELECT DISTINCT dept_id, age FROM employee;
5. 排序 ORDER BY
SELECT * FROM employee ORDER BY id ASC, age DESC;
-- 多字段排序:先按 id 升序,同 id 再按 age 降序
-- NULL 值視為最小值(ASC 排首)
6. 分頁 LIMIT
SELECT * FROM employee LIMIT 10; -- 前 10 行
SELECT * FROM employee LIMIT 10, 20; -- 跳過 10 行,取 20 行(第 11-30 行)
-- 偏移量從 0 開始
二、聚合函數實戰
-- 總行數
SELECT COUNT(*) FROM employee;
-- 分組統計
SELECT dept_id, COUNT(*) FROM employee GROUP BY dept_id;
-- 求和/平均(僅數值列)
SELECT student_id, SUM(score), AVG(score) FROM grade GROUP BY student_id;
-- 極值
SELECT MAX(age), MIN(age) FROM employee;
SELECT course, MAX(score) FROM grade GROUP BY course;
三、UNION 合併查詢
SELECT id, name FROM employee WHERE dept_id = 1
UNION -- 去重
SELECT id, name FROM employee WHERE dept_id = 2;
SELECT id, name FROM employee WHERE dept_id = 1
UNION ALL -- 不去重,效能更高
SELECT id, name FROM employee WHERE dept_id = 2;
UNION 要求各 SELECT 列數、類型、順序一致。
四、別名規範
-- 表別名:簡化多表查詢
SELECT e.name, d.dept_name FROM employee e JOIN department d ON e.dept_id = d.dept_id;
-- 字段別名:提升可讀性
SELECT dept_id AS department_id, dept_name AS department_name FROM department;
五、進階查詢模式速覽
- 子查詢:
WHERE id IN (SELECT employee_id FROM salary WHERE amount > 5000)
- 衍生表:
SELECT * FROM (SELECT dept_id, AVG(salary) avg_sal FROM employee GROUP BY dept_id) t WHERE avg_sal > 10000
- CTE (MySQL 8.0+):
WITH high_sal AS (...) SELECT * FROM high_sal
避坑清單
- 生產禁用
SELECT *
NOT IN 子查詢含 NULL 會返回空結果,改用 NOT EXISTS
- 隱式類型轉換導致索引失效(字符串列比數值)
- 大偏移量
LIMIT 1000000, 10 效能極差,改用游標/ID 範圍分頁