IFNULL(expr1, expr2)
-- 若 expr1 不為 NULL,返回 expr1;否則返回 expr2。
-- 返回類型:數值或字符串,取決於上下文。
學生表 tbl_student、成績表 tbl_score,查所有學生的英語成績,無成績顯示 0:
SELECT
stu.*,
IFNULL(score.english_score, 0) AS english_score
FROM tbl_student stu
LEFT JOIN tbl_score score ON stu.stu_id = score.stu_id;
解析:
score.english_score 為 NULL) → 顯示 0。LEFT JOIN 保證學生主表全量輸出。| 函數 | 參數數 | 特點 | 適用場景 |
|---|---|---|---|
IFNULL(a,b) | 2 | MySQL 專有,簡潔 | 單列空值替換 |
COALESCE(a,b,c...) | ≥2 | 標準 SQL,返回第一個非 NULL | 多備選值、跨庫遷移 |
CASE WHEN a IS NULL THEN b ELSE a END | — | 最通用,可加複雜邏輯 | 需判斷非 NULL 條件 |
IFNULL 在執行計劃中通常被優化為常數傳遞,開銷極小。WHERE 條件中對大量行使用 IFNULL(col, 0) = 0,會導致全表掃描;改用 col IS NULL OR col = 0 利用索引。IFNULL 是處理「業務意義上的預設值」最直觀的函數,配合 LEFT JOIN、報表查詢、數據清洗,能大幅簡化應用層判空邏輯。