萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 條件查詢實戰:WHERE 日期範圍、IF 判斷、CASE WHEN 多重分支

MySQL 流程控制函數 IF()、CASE 在查詢與預存程序中的實戰用法大全。

1. WHERE 日期區間查詢

-- 以某日期為中心,前後各 5 天
SELECT * FROM news
WHERE DATE(adddate) BETWEEN '2011-04-20' - INTERVAL 5 DAY
                        AND '2011-04-20' + INTERVAL 5 DAY;

-- 列舉特定日期
SELECT * FROM news
WHERE DATE(adddate) IN ('2011-04-20','2011-04-15','2011-04-25');

2. IF() 函數 — 單條件雙分支 (可用於 SELECT/WHERE/SET)

SELECT id, IF(status=1, '啟用', '停用') AS status_desc FROM users;

-- 更新:存在則 +1,不存在則插入 (配合 INSERT ... ON DUPLICATE KEY UPDATE)
INSERT INTO counter (k, v) VALUES ('pv', 1)
ON DUPLICATE KEY UPDATE v = v + 1;

3. 預存程序中的 IF 語句 — 邏輯分支

CREATE PROCEDURE upsert_user(
  IN p_name VARCHAR(50), IN p_phone VARCHAR(20), IN p_email VARCHAR(100)
)
BEGIN
  DECLARE v_cnt INT DEFAULT 0;
  SELECT COUNT(*) INTO v_cnt FROM users WHERE phone = p_phone;

  IF v_cnt > 0 THEN
    UPDATE users SET name=p_name, email=p_email, login_at=NOW() WHERE phone=p_phone;
  ELSE
    INSERT INTO users (name, phone, email, login_at) VALUES (p_name, p_phone, p_email, NOW());
  END IF;
END;

4. CASE 表達式 — 多重分支 (兩種語法)

簡單 CASE (比較單一值)

SELECT
  substr(area_id,1,1) AS type,
  substr(area_id,2) AS id,
  CASE substr(area_id,1,1)
    WHEN 'c' THEN (SELECT country FROM country_id WHERE id=substr(area_id,2))
    ELSE (SELECT province FROM province_id WHERE id=substr(area_id,2))
  END AS name
FROM t_ad_area;

搜尋 CASE (布林表達式)

SELECT
  CASE
    WHEN score >= 90 THEN 'A'
    WHEN score >= 80 THEN 'B'
    WHEN score >= 60 THEN 'C'
    ELSE 'D'
  END AS grade
FROM exam_result;

5. 實戰組合:動態分組統計

SELECT
  department,
  SUM(CASE WHEN gender='M' THEN 1 ELSE 0 END) AS male_cnt,
  SUM(CASE WHEN gender='F' THEN 1 ELSE 0 END) AS female_cnt,
  COUNT(*) AS total
FROM employees
GROUP BY department;

效能提示

  • IF()/CASE 在 SELECT 列表中為標量運算,開銷極低。
  • WHERE 條件中使用 CASE 可能阻礙索引使用,改寫為 OR/IN/UNION ALL。
  • 大量資料轉換建議在應用層或 ETL 階段完成,減少資料庫 CPU 壓力。
copyright © 萬盛學電腦網 all rights reserved