MySQL IF语句

时间:2019-11-20 08:52:30  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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语句根据指定条件有条件地执行代码块。