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之间的代码。
如果条件的计算结果为TRUE,则将执行IF-THEN和END IF之间的语句。
否则,控制权将传递到END IF之后的下一个语句。其次,指定条件评估为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。
首先,从客户表中选择由pCustomerNumber指定的客户的creditLimit,并将其存储在本地变量credit中。
然后,如果客户的信用额度大于50,000,则将OUT参数pCustomerLevel的值设置为PLATINUM。
该语句查找信用额度大于50,000的所有客户:
SELECT customerNumber, creditLimit FROM customers WHERE creditLimit > 50000 ORDER BY creditLimit DESC;
这是部分输出:
这些语句为客户141调用GetCustomerLevel()存储过程,并显示OUT参数pCustomerLevel的值:
CALL GetCustomerLevel(141, @level); SELECT @level;
因为客户141的信用额度大于50,000,所以按预期将其级别设置为PLATINUM。
MySQL IF-THEN-ELSE语句
如果您想在IF分支中的条件未评估为TRUE时执行其他语句,则可以使用IF-THEN-ELSE语句,如下所示:
IF condition THEN statements; ELSE else-statements; END IF;
用这种语法,如果条件的计算结果为TRUE,则执行IF-THEN和ELSE之间的语句。
否则,将执行ELSE和END IF之间的else语句。
让我们修改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分支。
如果信用额度不超过50,000,我们将在ELSE和END IF之间的区域中将客户级别设置为NOT PLATINUM。
此查询查找信用额度小于或等于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;
在这种语法中,如果条件的计算结果为TRUE,则会执行IF-THEN分支中的语句;否则,将评估下一个elseif条件。
如果elseif条件评估为TRUE,则执行elseif语句;否则,执行false。
否则,将评估下一个elseif条件。
IF-THEN-ELSEIF-ELSE语句可以具有多个ELSEIF分支。
如果IF中的任何条件且ELSE IF中的条件都不为TRUE,则会执行ELSE分支中的else语句。
我们将修改GetCustomerLevel()存储过程以使用IF-THEN-ELSEIF-ELSE语句。
首先,删除GetCustomerLevel()存储过程:
DROP PROCEDURE GetCustomerLevel;
然后,使用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 ;
在此存储过程中:
如果信用额度大于50,000,则客户级别为PLATINUM。
如果信用额小于或等于50,000且大于10,000,则客户级别为GOLD。
否则,客户级别为SILVER。
这些语句调用存储过程GetCustomerLevel()并显示客户级别447:
CALL GetCustomerLevel(447, @level); SELECT @level;
如果您对信用额度为10000或更少的客户测试存储过程,则输出将为SILVER。
在本教程中,您学习了如何使用MySQL IF语句根据指定条件有条件地执行代码块。