Resumo : neste tutorial, você aprenderá como usar a instrução MySQL IF para executar um bloco de código SQL com base em uma condição especificada.
Observe que o MySQL possui uma função IF() que difere da IF
instrução descrita neste tutorial.
A IF
instrução permite avaliar uma ou mais condições e executar o bloco de código correspondente se a condição for verdadeira.
A IF
declaração tem três formas:
IF...THEN
instrução: Avalie uma condição e execute um bloco de código se a condição for verdadeira.IF...THEN...ELSE
instrução: Avalie uma condição e execute um bloco de código se a condição for verdadeira; caso contrário, execute outro bloco de código.IF...THEN...ELSEIF...ELSE
instrução: Avalie várias condições e execute um bloco de código se uma condição for verdadeira. Se todas as condições forem falsas, execute o bloco de código naELSE
ramificação.
Declaração SE-ENTÃO
A IF...THEN
instrução permite executar um conjunto de instruções SQL com base em uma condição especificada.
O seguinte ilustra a sintaxe da IF-THEN
instrução:
IF condition THEN
statements;
END IF;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
- Primeiro, defina uma condição para executar o código entre
IF...THEN
eEND IF
. Se thecondition
for verdadeiro, as instruções entreIF-THEN
eEND IF
serão executadas. Caso contrário, o controle é passado para a próxima instrução após oEND IF
. - Segundo, especifique o código que será executado se for
condition
avaliado comoTRUE
.
Usaremos a customers
tabela do banco de dados de exemplo para a demonstração:
O seguinte procedimento cria um novo procedimento armazenado nomeado GetCustomerLevel()
no banco de dados de exemplo :
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 ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O procedimento armazenado GetCustomerLevel()
aceita dois parâmetros: pCustomerNumber
e pCustomerLevel
.
- Primeiro, selecione
creditLimit
o cliente especificado pelapCustomerNumber
tabelacustomers
e armazene-o na variável localcredit
. - Em seguida, defina o valor do
OUT
parâmetropCustomerLevel
comoPLATINUM
se o limite de crédito do cliente for maior que50,000
.
Esta declaração encontra todos os clientes que possuem um limite de crédito superior a 50,000
:
SELECT
customerNumber,
creditLimit
FROM
customers
WHERE
creditLimit > 50000
ORDER BY
creditLimit DESC;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Aqui está a saída parcial:
Estas instruções chamam o GetCustomerLevel()
procedimento armazenado para o cliente 141 e mostram o valor do OUT
parâmetro pCustomerLevel
:
CALL GetCustomerLevel(141, @level);
SELECT @level;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+----------+
| @level |
+----------+
| PLATINUM |
+----------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Como o cliente 141 tem um limite de crédito superior a 50,000
, o seu nível é definido PLATINUM
como esperado.
Instrução IF-THEN-ELSE
Caso você queira executar outras instruções quando o condition
na IF
ramificação não for avaliado como TRUE
, você pode usar a IF-THEN-ELSE
instrução da seguinte forma:
IF condition THEN
statements;
ELSE
else-statements;
END IF;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, se o for condition
avaliado como verdadeiro, o statements
entre IF-THEN
e ELSE
será executado. Caso contrário, o else-statements
entre o ELSE
e END IF
executar.
Vamos modificar o GetCustomerLevel()
procedimento armazenado.
Primeiro, elimine o GetCustomerLevel
procedimento armazenado:
DROP PROCEDURE GetCustomerLevel;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em seguida, crie o GetCustomerLevel
procedimento armazenado com o novo código:
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 ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No procedimento armazenado atualizado, incluímos a ELSE
ramificação. Se the credit
não for maior que 50,000
, definimos o nível do cliente NOT PLATINUM
no bloco entre ELSE
e END IF
.
Esta consulta encontra clientes com limites de crédito menores ou iguais 50,000
:
SELECT
customerNumber,
creditLimit
FROM
customers
WHERE
creditLimit <= 50000
ORDER BY
creditLimit DESC;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Esta imagem mostra a saída parcial:
As instruções a seguir chamam o procedimento armazenado para o número do cliente 447
e mostram o valor do OUT
parâmetro pCustomerLevel
:
CALL GetCustomerLevel(447, @level);
SELECT @level;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+--------------+
| @level |
+--------------+
| NOT PLATINUM |
+--------------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
O limite de crédito do cliente 447
é menor que 50,000
, portanto, o extrato na ELSE
agência é executado e define o valor do OUT
parâmetro pCustomerLevel
como NOT PLATINUM
.
Instrução IF-THEN-ELSEIF-ELSE
A IF-THEN-ELSEIF-ELSE
instrução permite verificar múltiplas condições sequencialmente. Aqui está a sintaxe básica da IF-THEN-ELSEIF-ELSE
instrução:
IF condition THEN
statements;
ELSEIF elseif-condition THEN
statements;
...
ELSE
statements;
END IF;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
- Se a condição inicial for verdadeira, as instruções associadas serão executadas. Se for falso, o programa verifica a próxima condição (
ELSEIF
). - Se alguma das
ELSEIF
condições for verdadeira, as instruções correspondentes serão executadas. - Se nenhuma das condições for verdadeira, as instruções do
ELSE
bloco serão executadas.
Modificaremos o GetCustomerLevel()
procedimento armazenado para usar a IF-THEN-ELSEIF-ELSE
instrução.
Primeiro, elimine o GetCustomerLevel()
procedimento armazenado:
DROP PROCEDURE GetCustomerLevel;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em seguida, recrie o novo GetCustomerLevel()
procedimento armazenado que usa a IF-THEN-ELSEIF-ELSE
instrução.
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 ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Neste procedimento armazenado:
- Se o crédito for maior que
50,000
, o nível do cliente éPLATINUM
. - Se o crédito for menor ou igual
50,000
e maior que10,000
, então o nível do cliente éGOLD
. - Caso contrário, o nível do cliente é
SILVER
.
Essas instruções chamam o procedimento armazenado GetCustomerLevel()
e mostram o nível do cliente 447
:
CALL GetCustomerLevel(447, @level);
SELECT @level;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+--------+
| @level |
+--------+
| GOLD |
+--------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Resumo
- Use
IF...THEN
instrução para executar condicionalmente um bloco de instruções com base na avaliação de uma condição especificada. - Use
IF...THEN...ELSE
instrução para executar um bloco de instruções se uma condição especificada for verdadeira e um bloco alternativo de instruções se a condição for falsa. - Use
IF...THEN...ELSEIF...ELSE
a instrução para avaliar múltiplas condições sequencialmente e executar blocos de instruções correspondentes com base na primeira condição verdadeira, com um bloco opcional de instruções para executar se nenhuma das condições for verdadeira.