首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL IF 與 CASE 語句全解析:表達式、流程控制、存儲過程實戰

     編輯:MySQL 綜合教學

MySQL IF 與 CASE 語句全解析:表達式、流程控制、存儲過程實戰

IF 與 CASE 在 MySQL 中雙重身份:**表達式**(可用於 SELECT/WHERE)與**流程控制語句**(僅用於存儲過程/觸發器/複合語句)。本文系統區分兩種模式,並給出存儲過程實戰模板。

一、IF 表達式(三元運算符)

IF(expr1, expr2, expr3)
-- expr1 為 TRUE(非 0 且非 NULL)返回 expr2,否則返回 expr3

實例

SELECT *, IF(sva=1, '男', '女') AS gender FROM taname WHERE sva != '';
  • 返回類型取決於上下文:數值上下文返回數值,字符串上下文返回字符串。
  • IFNULL(expr1, expr2):expr1 非 NULL 返回 expr1,否則 expr2。常用於空值填充:IFNULL(comm, 0)。

二、CASE 表達式(兩種形式)

1. 簡單 CASE:等值匹配

CASE col 
  WHEN val1 THEN result1
  WHEN val2 THEN result2
  ELSE default_result
END
SELECT CASE sva WHEN 1 THEN '男' ELSE '女' END AS gender FROM taname WHERE sva != '';

2. 搜索 CASE:條件表達式

CASE 
  WHEN cond1 THEN result1
  WHEN cond2 THEN result2
  ELSE default_result
END
SELECT CASE 
  WHEN score >= 90 THEN 'A'
  WHEN score >= 80 THEN 'B'
  WHEN score >= 70 THEN 'C'
  WHEN score >= 60 THEN 'D'
  ELSE 'E'
END AS grade FROM student;
  • 無匹配且無 ELSE → 返回 NULL。
  • 結果類型按「最高優先級」推導:STRING > REAL > INTEGER。

三、IF 流程控制語句(存儲過程專用)

IF search_condition THEN
    statement_list
[ELSEIF search_condition THEN
    statement_list] ...
[ELSE
    statement_list]
END IF;

關鍵點:

  • END IF 後**必須加分號**結束語句。
  • search_condition 支持 =, <, <=, >, >=, !=, AND, OR, NOT 組合。
  • 僅可用於 BEGIN ... END 複合語句塊(存儲過程、函數、觸發器、事件)。

四、存儲過程實戰:成績等級判定

DELIMITER $$
CREATE PROCEDURE `dbname`.`proc_getGrade`(
    IN stu_no VARCHAR(20),
    IN cour_no VARCHAR(10)
)
BEGIN
    DECLARE stu_grade FLOAT;
    
    SELECT grade INTO stu_grade 
    FROM grade 
    WHERE student_no = stu_no AND course_no = cour_no;
    
    IF stu_grade >= 90 THEN
        SELECT stu_grade, 'A';
    ELSEIF stu_grade < 90 AND stu_grade >= 80 THEN
        SELECT stu_grade, 'B';
    ELSEIF stu_grade < 80 AND stu_grade >= 70 THEN
        SELECT stu_grade, 'C';
    ELSEIF stu_grade < 70 AND stu_grade >= 60 THEN
        SELECT stu_grade, 'D';
    ELSE
        SELECT stu_grade, 'E';
    END IF;
END $$
DELIMITER ;

五、CASE 流程控制語句(存儲過程)

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE;

-- 或搜索形式
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE;
  • 同樣需 END CASE; 結束。
  • 適合多分支等值或範圍判斷,結構比 IF-ELSEIF 更清晰。

六、選型建議

場景推薦理由
SELECT/WHERE/SET 列表中單值邏輯IF() / CASE 表達式內聯執行,無上下文切換
存儲過程中 2-3 分支IF 流程控制簡單直觀
存儲過程中 ≥4 分支或範圍判斷CASE 流程控制結構清晰,易維護
空值填充IFNULL() / COALESCE()語義明確,標準 SQL

表達式屬於「查詢語言」,流程控制屬於「程序語言」。分清身份,才能在正確位置寫出正確代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved