MySQL SELECT 語句完整實戰指南:基礎語法、條件過濾、多表關聯、排序分頁、聚合統計、常用函數,適合從建表到業務查詢的全階段學習。
SELECT [DISTINCT] 列名/表達式
FROM 表名 [別名]
[WHERE 條件]
[GROUP BY 分組列]
[HAVING 分組過濾]
[ORDER BY 排序列 [ASC|DESC]]
[LIMIT 偏移量, 行數]
-- 表結構: name, sex, birth, birthaddr
-- 數據: abccs/f/1977-07-07/china, mary/f/1978-12-12/usa, tom/m/1970-09-02/usa
SELECT * FROM mytable;
-- 結果: 3 行 4 列
-- 單條件
SELECT * FROM mytable WHERE name = 'tom';
-- 組合條件 (AND/OR/NOT)
SELECT * FROM mytable WHERE sex = 'f' AND birthaddr = 'china';
-- 結果: abccs 行
-- 模糊匹配
SELECT * FROM mytable WHERE name LIKE 'm%'; -- mary
SELECT * FROM mytable WHERE name LIKE '%a%'; -- mary, abccs
-- 範圍查詢
SELECT * FROM mytable WHERE birth BETWEEN '1970-01-01' AND '1978-12-31';
SELECT name FROM mytable;
SELECT name, birth FROM mytable;
-- 升序 (默認)
SELECT name, birth FROM mytable ORDER BY birth;
-- tom(1973), abccs(1977), mary(1978)
-- 降序
SELECT name, birth FROM mytable ORDER BY birth DESC;
-- mary, abccs, tom
-- 多列排序
SELECT * FROM mytable ORDER BY sex ASC, birth DESC;
-- 總行數
SELECT COUNT(*) FROM mytable; -- 3
-- 分組計數
SELECT sex, COUNT(*) FROM mytable GROUP BY sex;
-- f:2, m:1
-- 多維聚合
SELECT sex, birthaddr, COUNT(*), AVG(YEAR(birth))
FROM mytable GROUP BY sex, birthaddr;
-- 分組過濾 (HAVING)
SELECT sex, COUNT(*) FROM mytable GROUP BY sex HAVING COUNT(*) > 1;
-- f:2
UPDATE mytable SET birth = '1973-09-02' WHERE name = 'tom';
| 技巧 | 語法示例 | 場景 |
|---|---|---|
| 分頁 | LIMIT 10 OFFSET 20 / LIMIT 20, 10 | Web 列表分頁 |
| 去重 | SELECT DISTINCT sex FROM mytable; | 獲取枚舉值集合 |
| 別名 | SELECT name AS username FROM mytable; | 列重命名、表關聯消歧 |
| 條件表達式 | SELECT name, IF(sex='f','女','男') AS gender FROM mytable; | 結果集轉換 |
| 空值處理 | SELECT COALESCE(birthaddr, '未知') FROM mytable; | NULL 替換默認值 |
| 子查詢 | SELECT * FROM mytable WHERE birth = (SELECT MIN(birth) FROM mytable); | 最早出生者 |
EXPLAIN 驗證 type=ref/rangeWHERE id > last_id LIMIT 10 (游標分頁) 替代 OFFSET