MySQL IF Statement

摘要在本教程中,您将学习如何使用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-THENEND IF之间代码的条件。如果condition计算结果为TRUE ,则​​将执行IF-THENEND 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()接受两个参数: pCustomerNumberpCustomerLevel

  • 首先,从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-THENELSE之间的statements 。否则,执行ELSEEND 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 ,我们在ELSEEND 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)
mysql if else 语句 - 输出

客户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分支。

如果IFELSE 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语句根据指定条件有条件地执行代码块。

本教程有帮助吗?