MySQL IF 语句
总结_:_在本教程中,您将学习如何使用MySQL IF 语句根据指定条件执行一段 SQL 代码。
请注意,MySQL 有一个IF()函数,它与 IF 本教程中描述的语句不同。
该 IF 声明有三种形式:简单的 IF-THEN 声明, IF-THEN-ELSE 声明和 IF-THEN-ELSEIF- ELSE 陈述。
MySQL简单 IF-THEN 语句
该 IF-THEN 语句允许您根据指定的条件执行一组 SQL 语句。下面说明了该 IF-THEN 语句的语法:
IF condition THEN
statements;
END IF;
在这个语法中:
- 首先,指定要执行的代码的条件
IF-THEN和END IF。如果condition计算结果为TRUE,则IF-THEN和之间的语句END IF将执行。否则,控制将传递到END IF. - 其次,指定
condition计算结果为 时将执行的代码TRUE。
我们将使用 customers 示例数据库中的表进行演示:

请参阅以下 GetCustomerLevel() 存储过程。
DELIMITER $$
CREATE PROCEDURE GetCustomerLevel(
IN pCustomerNumber INT,
OUT pCustomerLevel VARCHAR(20))
BEGIN
DECLARE credit DECIMAL(10,2) DEFAULT 0;
SELECT creditLimit
INTO credit
FROM customers
WHERE customerNumber = pCustomerNumber;
IF credit > 50000 THEN
SET pCustomerLevel = 'PLATINUM';
END IF;
END$$
DELIMITER ;
存储过程 GetCustomerLevel() 接受两个参数: pCustomerNumber 和 pCustomerLevel 。
- 首先,从表中选择
creditLimit指定的客户并将其存储在局部变量 中。pCustomerNumbercustomerscredit - 然后,如果客户的信用额度大于,则将该
OUT参数的值设置为。pCustomerLevelPLATINUM50,000
此语句查找信用额度大于 的所有客户 50,000 :
SELECT
customerNumber,
creditLimit
FROM
customers
WHERE
creditLimit > 50000
ORDER BY
creditLimit DESC;
这是部分输出:

这些语句调用 GetCustomerLevel() 客户 141的存储过程并显示 OUT 参数的值 pCustomerLevel :
CALL GetCustomerLevel(141, @level);
SELECT @level;

由于客户 141 的信用额度大于 50,000 ,因此其级别设置 PLATINUM 为预期。
MySQL IF-THEN-ELSE 语句
如果您想 condition 在 IF 分支中的 不计算为时执行其他语句 TRUE ,您可以使用 IF-THEN-ELSE 如下语句:
IF condition THEN
statements;
ELSE
else-statements;
END IF;
在此语法中,如果 condition 计算结果为 TRUE ,则 statements 介于 IF-THEN 和 ELSE 执行之间。否则, else-statements 在 ELSE 和之间 END IF 执行。
让我们修改 GetCustomerLevel() 存储过程。
首先,删除 GetCustomerLevel() 存储过程:
DROP PROCEDURE GetCustomerLevel;
然后, GetCustomerLevel() 使用新代码创建存储过程:
DELIMITER $$
CREATE PROCEDURE GetCustomerLevel(
IN pCustomerNumber INT,
OUT pCustomerLevel VARCHAR(20))
BEGIN
DECLARE credit DECIMAL DEFAULT 0;
SELECT creditLimit
INTO credit
FROM customers
WHERE customerNumber = pCustomerNumber;
IF credit > 50000 THEN
SET pCustomerLevel = 'PLATINUM';
ELSE
SET pCustomerLevel = 'NOT PLATINUM';
END IF;
END$$
DELIMITER ;
在这个新的存储过程中,我们包含了 ELSE 分支。如果 credit 不大于 50,000 ,我们将客户级别设置为和 NOT PLATINUM 之间的块。 ELSE END IF
此查询查找信用额度小于或等于 的客户 50,000 :
SELECT
customerNumber,
creditLimit
FROM
customers
WHERE
creditLimit <= 50000
ORDER BY
creditLimit DESC;
这张图显示了部分输出:

以下语句调用客户编号的存储过程 447 并显示 OUT 参数值 pCustomerLevel :
CALL GetCustomerLevel(447, @level);
SELECT @level;

客户的信用额度 447 不足 50,000 ,因此,在该声明中 ELSE 分支执行,并设置的值 OUT 参数 pCustomerLevel 来 NOT PLATINUM 。
MySQL IF-THEN-ELSEIF-ELSE 语句
如果要根据多个条件有条件地执行语句,请使用以下 IF-THEN-ELSEIF-ELSE 语句:
IF condition THEN
statements;
ELSEIF elseif-condition THEN
elseif-statements;
...
ELSE
else-statements;
END IF;
在此语法中,如果 condition 计算结果为 TRUE ,则 statements 在 IF-THEN 分支执行; 否则,下一个 elseif-condition 被评估。
如果 elseif-condition 评估为 TRUE ,则 elseif-statement 执行;否则,下一个 elseif-condition 被评估。
该 IF-THEN-ELSEIF-ELSE 声明可以有多个 ELSEIF 分支。
如果 IF and 中没有条件 ELSE IF 计算为 TRUE , else-statements 则 ELSE 分支中的 将执行。
我们将修改 GetCustomerLevel() 存储过程以使用该 IF-THEN-ELSEIF-ELSE 语句。
首先,删除 GetCustomerLevel() 存储过程:
DROP PROCEDURE GetCustomerLevel;
然后,创建 GetCustomerLevel() 使用该 IF-THEN-ELSEIF-ELSE 语句的新存储过程。
DELIMITER $$
CREATE PROCEDURE GetCustomerLevel(
IN pCustomerNumber INT,
OUT pCustomerLevel VARCHAR(20))
BEGIN
DECLARE credit DECIMAL DEFAULT 0;
SELECT creditLimit
INTO credit
FROM customers
WHERE customerNumber = pCustomerNumber;
IF credit > 50000 THEN
SET pCustomerLevel = 'PLATINUM';
ELSEIF credit <= 50000 AND credit > 10000 THEN
SET pCustomerLevel = 'GOLD';
ELSE
SET pCustomerLevel = 'SILVER';
END IF;
END $$
DELIMITER ;
在这个存储过程中:
- 如果信用大于
50,000,则客户等级为PLATINUM。 - 如果信用小于或等于
50,000且大于10,000,则客户级别为GOLD。 - 否则,客户的级别为
SILVER。
这些语句调用存储过程 GetCustomerLevel() 并显示客户的级别 447 :
CALL GetCustomerLevel(447, @level);
SELECT @level;

如果您使用信用额度为 10000 或更少的客户测试存储过程,您将获得输出为 SILVER .
在本教程中,您学习了如何使用 MySQL IF 语句根据指定条件有条件地执行代码块。