SUM(A+B) ≠ SUM(A)+SUM(B) 當 A 或 B 為 NULL 時,SUM(A+B)=NULL。
解法:SUM(COALESCE(A,0) + COALESCE(B,0)) 或 SUM(IFNULL(A,0)+IFNULL(B,0))。
WHERE status=1 OR status=2 OR status=3 → WHERE status IN (1,2,3)
效能:OR O(n) 線性掃描,IN O(log n) 二分查找(優化器轉為範圍查詢)。
⚠️ IN 列表建議 < 200 個值,超過考慮臨時表 JOIN。
WHERE a=1 OR b=2 通常走不了索引 → 改為:
SELECT * FROM t WHERE a=1 UNION ALL SELECT * FROM t WHERE b=2
去重需求用 UNION,無去重必用 UNION ALL(避免排序去重開銷)。
無去重需求 → UNION ALL。
UNION 會排序去重,開銷大;UNION ALL 直接合併結果集。
GROUP BY col 預設按分組欄位排序。
不需排序 → GROUP BY col ORDER BY NULL 或 GROUP BY col DESC (5.7+)。
數字型索引比字串型:空間小、比較快、CPU 友善。
設計階段優先選 INT/BIGINT,避免 VARCHAR 存純數字。
LOAD DATA 比 INSERT 快 **20 倍**INSERT VALUES(),(),() 減少索引刷新INSERT ... SELECT ...:延遲高、同步易出錯INT(3) vs INT(11):**儲存皆 4 位元組,範圍完全相同**。
M 僅影響 ZEROFILL 時的前導零顯示:INT(3) ZEROFILL 存 10 → 顯示 010。
不加 ZEROFILL 時 M 無任何實質作用。
大表 COUNT(DISTINCT col) 記憶體暴漲甚至 OOM。
優化:臨時表分步驟 ——
-- 步驟 1:去重寫入臨時表
CREATE TEMPORARY TABLE tmp AS
SELECT col FROM big_table GROUP BY col;
-- 步驟 2:計數
SELECT COUNT(*) FROM tmp;
| 函數 | 用法 | 範例 |
|---|---|---|
| REPLACE | 字串替換 | UPDATE t SET c=REPLACE(c,'old','new') |
| CONCAT | 連接 | SELECT CONCAT(a,'_',b) FROM t |
| IFNULL(e1,e2) | 非空返回 e1 否則 e2 | IFNULL(score,0) |
| IF(cond,t,f) | 條件表達式 | IF(sex=1,'男','女') |
| CASE WHEN | 多分支 | CASE WHEN x>0 THEN '正' ELSE '負' END |
MySQL 禁止同表子查詢更新/刪除,用臨時表繞過:
DELETE FROM t
WHERE id NOT IN (
SELECT id FROM (
SELECT MIN(id) AS id FROM t GROUP BY uid
) tmp
);