缺點:網絡傳輸多餘數據、應用層 CPU 消耗、代碼冗長。
IFNULL(expr1, expr2)
-- expr1 非 NULL 返回 expr1,否則返回 expr2
-- 查詢用戶名,為空則顯示 '匿名用戶'
SELECT id, IFNULL(name, '匿名用戶') AS name FROM users;
-- 計算總評論數,NULL 視為 0
SELECT article_id, IFNULL(SUM(comment_count), 0) AS total_comments
FROM article_stats GROUP BY article_id;
-- 複雜表達式中使用
SELECT IFNULL(1/0, '除數為零') AS result; -- 返回 '除數為零'
| 函數 | 參數數 | 功能 | 標準 | 備註 |
|---|---|---|---|---|
| ISNULL(expr) | 1 | 判斷是否為 NULL(返回 0/1) | MySQL 專有 | 不支持替換值 |
| IFNULL(expr1, expr2) | 2 | expr1 非 NULL 返回 expr1,否則 expr2 | MySQL 專有 | 最常用 |
| COALESCE(v1, v2, ...) | N≥2 | 返回第一個非 NULL 值 | ANSI SQL 標準 | 可鏈式多參數 |
建議: 兩參數用 IFNULL,多參數鏈式用 COALESCE,避免 ISNULL 混淆。
3); -- NOT IN 排除(注意 NULL 陷阱) SELECT * FROM products WHERE category_id NOT IN (1, 2, 3); -- 若子查詢含 NULL,結果為空集! -- 配合元組(行構造器)MySQL 8.0+ SELECT * FROM order_items WHERE (order_id, product_id) IN ((1001, 50), (1002, 60));
val = ? 等值查詢,可用索引JOIN 臨時表或 EXISTS 子查詢NOT IN 子查詢若含 NULL 會導致全表掃描且結果為空,**慎用**,改用 NOT EXISTS 或 LEFT JOIN ... IS NULL文中展示的複雜 Hack SQL 利用了 IFNULL、MID、ORD、CAST 等函數組合繞過過濾,**理解這些函數行為是防禦注入的前提**。