摘要:在本教程中,您将学习如何使用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;
Code language: SQL (Structured Query Language) (sql)
在这个语法中:
- 首先,指定执行
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 ;
Code language: SQL (Structured Query Language) (sql)
存储过程GetCustomerLevel()
接受两个参数: pCustomerNumber
和pCustomerLevel
。
- 首先,从
customers
表中选择pCustomerNumber
指定的客户的creditLimit
,并将其存储在本地变量credit
中。 - 然后,如果客户的信用额度大于
50,000
,则将OUT
参数pCustomerLevel
的值设置为PLATINUM
。
此语句查找信用额度大于50,000
的所有客户:
SELECT
customerNumber,
creditLimit
FROM
customers
WHERE
creditLimit > 50000
ORDER BY
creditLimit DESC;
Code language: SQL (Structured Query Language) (sql)
这是部分输出:
这些语句调用客户 141 的GetCustomerLevel()
存储过程并显示OUT
参数pCustomerLevel
的值:
CALL GetCustomerLevel(141, @level);
SELECT @level;
Code language: SQL (Structured Query Language) (sql)
由于客户 141 的信用额度大于50,000
,因此其级别按预期设置为PLATINUM
。
MySQL IF-THEN-ELSE
语句
如果您想在IF
分支中的condition
不为TRUE
时执行其他语句,可以使用IF-THEN-ELSE
语句,如下所示:
IF condition THEN
statements;
ELSE
else-statements;
END IF;
Code language: SQL (Structured Query Language) (sql)
在此语法中,如果condition
计算结果为TRUE
,则执行IF-THEN
和ELSE
之间的statements
。否则,执行ELSE
和END IF
之间的else-statements
。
让我们修改GetCustomerLevel()
存储过程。
首先,删除GetCustomerLevel()
存储过程:
DROP PROCEDURE GetCustomerLevel;
Code language: SQL (Structured Query Language) (sql)
然后,使用新代码创建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 ;
Code language: SQL (Structured Query Language) (sql)
在这个新的存储过程中,我们包含ELSE
分支。如果credit
不大于50,000
,我们在ELSE
和END IF
之间的块中将客户级别设置为NOT PLATINUM
。
此查询查找信用额度小于或等于50,000
的客户:
SELECT
customerNumber,
creditLimit
FROM
customers
WHERE
creditLimit <= 50000
ORDER BY
creditLimit DESC;
Code language: SQL (Structured Query Language) (sql)
这张图显示了部分输出:
以下语句调用客户编号447
的存储过程并显示OUT
参数pCustomerLevel
的值:
CALL GetCustomerLevel(447, @level);
SELECT @level;
Code language: SQL (Structured Query Language) (sql)
客户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;
Code language: SQL (Structured Query Language) (sql)
在此语法中,如果condition
计算结果为TRUE
,则执行IF-THEN
分支中的statements
;否则,评估下一个elseif-condition
。
如果elseif-condition
计算结果为TRUE
,则执行elseif-statement
;否则,评估下一个elseif-condition
。
IF-THEN-ELSEIF-ELSE
语句可以有多个ELSEIF
分支。
如果IF
和ELSE IF
中的条件均不为TRUE
,则将执行ELSE
分支中的else-statements
。
我们将修改GetCustomerLevel()
存储过程以使用IF-THEN-ELSEIF-ELSE
语句。
首先,删除GetCustomerLevel()
存储过程:
DROP PROCEDURE GetCustomerLevel;
Code language: SQL (Structured Query Language) (sql)
然后,创建使用IF-THEN-ELSEIF-ELSE
语句的新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';
ELSEIF credit <= 50000 AND credit > 10000 THEN
SET pCustomerLevel = 'GOLD';
ELSE
SET pCustomerLevel = 'SILVER';
END IF;
END $$
DELIMITER ;
Code language: SQL (Structured Query Language) (sql)
在此存储过程中:
- 如果信用大于
50,000
,则客户级别为PLATINUM
。 - 如果信用值小于或等于
50,000
且大于10,000
,则客户级别为GOLD
。 - 否则,客户的级别为
SILVER
。
这些语句调用存储过程GetCustomerLevel()
并显示客户的级别447
:
CALL GetCustomerLevel(447, @level);
SELECT @level;
Code language: SQL (Structured Query Language) (sql)
如果您使用信用额度为 10000 或更少的客户测试存储过程,您将得到SILVER
输出。
在本教程中,您学习了如何使用 MySQL IF
语句根据指定条件有条件地执行代码块。