Guia da Função IFNULL do MySQL: Substitua Valores NULL (Alternativa ao NVL do Oracle)

目次

1. Introdução

Ao trabalhar com bancos de dados, manipular valores NULL é um ponto crítico.
Em particular, não é incomum que pessoas acostumadas à função NVL do Oracle percebam que NVL não está disponível ao migrar para MySQL.

No MySQL, você pode manipular valores NULL corretamente usando a função IFNULL em vez de NVL.
Este artigo explica como trabalhar com valores NULL no MySQL em detalhes, abordando como usar IFNULL e como ela difere de outras funções de tratamento de NULL.

1.1 O que é um valor NULL?

Em bancos de dados, NULL significa “nenhum valor foi definido”.
Como isso é diferente de “0” ou de uma “string vazia”, não tratá‑lo adequadamente pode levar a erros inesperados ou resultados de consulta incorretos.

Por exemplo, suponha que você tenha dados como os seguintes.

IDNameAge
1Yamada25
2SatoNULL
3Suzuki30

Nos dados acima, a idade para o ID “2” (Sato) é NULL.
Se você executar cálculos como estão, pode obter erros ou resultados indesejados.

1.2 Como o MySQL trata valores NULL

2. O que é a função IFNULL?

O MySQL fornece a função IFNULL como uma função para substituir valores NULL por outro valor.
Ela desempenha um papel semelhante à função NVL do Oracle.

Ao tratar valores NULL adequadamente, você pode evitar problemas de cálculo causados por dados ausentes e criar consultas SQL mais estáveis.
Vamos analisar mais de perto o uso básico do IFNULL.

2.1 Sintaxe básica do IFNULL

A sintaxe básica da função IFNULL é a seguinte.

IFNULL(expression, fallback_value)
  • expression : A coluna ou valor a ser verificado quanto a NULL
  • fallback_value : O valor a ser retornado quando a expressão for NULL (se não for NULL, a expressão é retornada como está)

Por exemplo, considere a seguinte instrução SQL.

SELECT IFNULL(NULL, 'Fallback value');

Neste caso, como NULL foi especificado, o resultado torna‑se 'Fallback value'.

Result
Fallback value

Por outro lado, se você especificar um valor não NULL, esse valor é retornado como está.

SELECT IFNULL('Hello', 'Fallback value');
Result
Hello

2.2 Principais características do IFNULL

A função IFNULL possui as seguintes características.

  1. Pode converter valores NULL em um valor específico
  • Você pode definir um valor padrão alternativo para colunas que podem conter NULL.
  1. Utiliza uma sintaxe simples
  • É mais simples de escrever do que usar uma expressão CASE.
  1. É necessário considerar os tipos de dados
  • É recomendado que os argumentos do IFNULL sejam do mesmo tipo de dado.

Por exemplo, o SQL a seguir pode causar um erro.

SELECT IFNULL(100, 'Error');

Motivo: um tipo numérico (100) e um tipo string (‘Error’) foram misturados.
Nesse caso, o valor de fallback também deve ser numérico.

SELECT IFNULL(100, 0);

2.3 Quando você deve usar IFNULL

Aqui estão algumas situações práticas em que IFNULL é útil.

  1. Definir um valor padrão para NULL
  • Por exemplo, se o bônus de um funcionário for NULL, defina‑o como 0.
    SELECT name, IFNULL(bonus, 0) AS bonus
    FROM employees;
    
  1. Evitar cálculos envolvendo NULL
  • Se você calcular com NULL como está, o resultado também se tornará NULL.
  • Usar IFNULL para evitar NULL permite que o cálculo seja realizado conforme o esperado.
    SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
    FROM employees;
    
  1. Tratar NULL corretamente em relatórios e agregações
  • Se NULL estiver presente durante a análise, relatórios incorretos podem ser gerados.
  • Substituindo NULL por um valor específico usando IFNULL, você pode processar os dados de forma consistente.

3. Exemplos práticos da função IFNULL

Na seção anterior, explicamos o básico da função IFNULL.
Nesta seção, apresentaremos exemplos concretos de seu uso com dados reais.

3.1 Substituir valores NULL por um valor padrão

Se uma tabela contiver valores NULL, isso pode causar comportamentos indesejados.
Para resolver isso, você pode usar IFNULL para substituir NULL por um valor padrão.

Exemplo: Se o bônus de um funcionário for NULL, defina o valor padrão como 0

SELECT name, IFNULL(bonus, 0) AS bonus
FROM employees;

Dados antes da execução

namebonus
Sato5000
SuzukiNULL
Takahashi8000

Depois de aplicar IFNULL

namebonus
Sato5000
Suzuki0
Takahashi8000

Substituir NULL por 0 torna a agregação e o processamento relacionado mais suaves.

3.2 Evite cálculos que incluam NULL

No MySQL, o resultado de um cálculo que inclui NULL torna‑se NULL.
Portanto, você precisa usar IFNULL para evitar NULL.

Exemplo: Calcule o total de salário e bônus

SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
FROM employees;

Dados antes da execução

namesalarybonus
Sato3000005000
Suzuki280000NULL
Takahashi3200008000

Depois de aplicar IFNULL

namesalarybonustotal_income
Sato3000005000305000
Suzuki2800000280000
Takahashi3200008000328000

Se o bônus for NULL, o total (salary + bonus) também se torna NULL,
mas ao aplicar IFNULL, o MySQL trata NULL como 0 e calcula corretamente.

3.3 Substitua NULL por outra string

Você pode definir uma string padrão não apenas para números, mas também quando o valor for NULL.

Exemplo: Mostrar “Não registrado” para usuários sem endereço de e‑mail

SELECT id, name, IFNULL(email, 'Not registered') AS email
FROM users;

Dados antes da execução

idnameemail
1Satosatou@example.com
2SuzukiNULL
3Takahashitakahashi@example.com

Depois de aplicar IFNULL

idnameemail
1Satosatou@example.com
2SuzukiNot registered
3Takahashitakahashi@example.com

Se deixado como NULL, o campo aparece em branco, mas IFNULL o torna explícito com “Não registrado”.

3.4 Use IFNULL em uma cláusula WHERE

Você pode usar IFNULL em uma cláusula WHERE para filtrar com base em condições que incluam valores NULL.

Exemplo: Recuperar apenas usuários com valores NULL

SELECT *
FROM users
WHERE IFNULL(email, '') = '';

Este SQL trata email como '' (uma string vazia) quando é NULL, e recupera apenas usuários cujo e‑mail é NULL.

3.5 Coloque valores NULL por último em ORDER BY

Normalmente, ao usar ORDER BY, valores NULL podem aparecer primeiro, mas você pode usar IFNULL para movê‑los para o final.

Exemplo: Colocar linhas com valores NULL por último

SELECT name, salary
FROM employees
ORDER BY IFNULL(salary, 0) ASC;

4. Diferenças entre IFNULL e COALESCE

O MySQL fornece várias funções para lidar com valores NULL, e IFNULL e COALESCE são frequentemente comparados.
Ambos substituem valores NULL por alternativas, mas seu uso e comportamento diferem.

Nesta seção, explicamos as diferenças entre IFNULL e COALESCE e como escolher a mais adequada.

4.1 O que é a função COALESCE?

A função COALESCE retorna o primeiro valor não‑NULL entre vários argumentos.
Em outras palavras, enquanto IFNULL seleciona o valor não‑NULL entre dois valores,
COALESCE difere ao selecionar o primeiro valor não‑NULL entre múltiplos candidatos.

Sintaxe

COALESCE(expr1, expr2, ... , exprN)
  • Avalia da esquerda para a direita e retorna o primeiro valor não‑NULL
  • Retorna NULL se todos os argumentos forem NULL

Exemplo: Substituindo NULL usando COALESCE

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

Neste caso, os valores são determinados da seguinte forma.

  1. Se phone não for NULL, retorne phone.
  2. Se phone for NULL e email não for NULL, retorne email.
  3. Se tanto phone quanto email forem NULL, retorne 'Não registrado'.

4.2 Diferenças entre IFNULL e COALESCE

Comparison itemIFNULLCOALESCE
NULL handlingReturns the fallback value if one expression is NULLEvaluates multiple expressions and returns the first non-NULL value
Number of argumentsOnly 22 or more (multiple allowed)
Use caseSimple NULL replacementNULL handling with priority order
Execution speedFast (compares only 2 values)Slightly slower (evaluates multiple values in order)

4.3 Exemplos práticos de IFNULL e COALESCE

Exemplo 1: Substituição simples de NULL

Com IFNULL, você pode selecionar o valor não‑NULL entre dois valores.

SELECT name, IFNULL(phone, 'Not registered') AS contact_info
FROM customers;

Resultado

namephonecontact_info
Sato080-1234-5678080-1234-5678
SuzukiNULLNot registered

Exemplo 2: Prefira o primeiro valor não‑NULL disponível

Com COALESCE, você pode recuperar o primeiro valor não‑NULL.

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

Resultado

namephoneemailcontact_info
Sato080-1234-5678satou@example.com080-1234-5678
SuzukiNULLsuzuki@example.comsuzuki@example.com
TakahashiNULLNULLNot registered
  • Se phone não for NULL, retorne phone
  • Se phone for NULL e email não for NULL, retorne email
  • Se tanto phone quanto email forem NULL, retorne 'Não registrado'

4.4 Como escolher entre IFNULL e COALESCE

✔ Quando você deve usar IFNULL

Quando você quer uma substituição simples de NULL por um valor padrão
Quando dois argumentos são suficientes (por exemplo, converter NULL para 0)

✔ Quando você deve usar COALESCE

Quando você quer encontrar o primeiro valor não-NULL (por exemplo, phone → email → “Not registered”)
Quando você precisa avaliar três ou mais valores

4.5 Comparação de desempenho entre IFNULL e COALESCE

Em geral, IFNULL é mais rápido que COALESCE.
Isso ocorre porque IFNULL avalia apenas dois valores, enquanto COALESCE avalia vários valores em ordem.

Teste de desempenho

Ao aplicar IFNULL e COALESCE a 1 milhão de linhas, você pode ver resultados como o seguinte.

FunctionExecution time (seconds)
IFNULL0.02
COALESCE0.05

Com grandes volumes de dados, IFNULL pode ser ligeiramente mais rápido.
➡ No entanto, se você precisar de apenas um fallback, use IFNULL; se quiser múltiplos candidatos, use COALESCE.

5. Funções de tratamento de NULL em bancos de dados diferentes do MySQL

O MySQL fornece a função IFNULL para lidar com valores NULL, mas outros sistemas de gerenciamento de banco de dados (SGBD) utilizam funções diferentes.
Nos principais bancos de dados como Oracle, PostgreSQL e SQL Server, é comum usar funções que diferem do MySQL para o tratamento de NULL.

Esta seção explica como os valores NULL são tratados em bancos de dados diferentes do MySQL.

5.1 Tratamento de NULL no Oracle: a função NVL

No Oracle, a função NVL é fornecida como equivalente ao IFNULL do MySQL.
A função NVL retorna outro valor quando o valor especificado é NULL.

Sintaxe

NVL(expression, fallback_value)
  • expression : A coluna ou valor a ser verificado quanto a NULL
  • fallback_value : O valor a ser retornado quando for NULL (se não for NULL, a expressão é retornada como está)

Exemplo

SELECT name, NVL(salary, 0) AS salary
FROM employees;

Resultado

namesalary
Sato5000
Suzuki0
Takahashi8000

O comportamento do NVL é quase o mesmo do IFNULL do MySQL, portanto no Oracle você pode simplesmente usar NVL.

5.2 Tratamento de NULL no PostgreSQL e SQL Server: a função COALESCE

No PostgreSQL e SQL Server, a função COALESCE é usada para substituir valores NULL por alternativas.
Essa função pode retornar o primeiro valor não-NULL entre múltiplos candidatos.

Sintaxe

COALESCE(expr1, expr2, ..., exprN)
  • Avalia da esquerda para a direita e retorna o primeiro valor não-NULL
  • Retorna NULL se todos os argumentos forem NULL

Exemplo

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

Resultado

namephoneemailcontact_info
Sato080-1234-5678satou@example.com080-1234-5678
SuzukiNULLsuzuki@example.comsuzuki@example.com
TakahashiNULLNULLNot registered

Como mostrado acima, no PostgreSQL e SQL Server, usar COALESCE permite um tratamento de NULL mais flexível que o IFNULL do MySQL.

5.3 Comparação de funções de tratamento de NULL entre bancos de dados

DatabaseNULL-handling functionRole
MySQLIFNULL(expression, fallback_value)Convert NULL to a fallback value
OracleNVL(expression, fallback_value)Convert NULL to a fallback value (equivalent to IFNULL)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)Return the first non-NULL value
  • Tratamento simples de NULLIFNULL (MySQL) ou NVL (Oracle)
  • Selecionar o melhor valor entre múltiplos candidatosCOALESCE (PostgreSQL, SQL Server)

5.4 Observações ao migrar entre diferentes SGBDs

Ao migrar sistemas entre diferentes bancos de dados, é necessário prestar atenção às diferenças nas funções de tratamento de NULL.
Em particular, ao migrar de Oracle para MySQL, você deve reescrever NVL para IFNULL.

Exemplos de reescrita durante a migração

  • Oracle (NVL)
    SELECT NVL(salary, 0) AS salary FROM employees;
    
  • MySQL (IFNULL)
    SELECT IFNULL(salary, 0) AS salary FROM employees;
    
  • PostgreSQL / SQL Server (COALESCE)
    SELECT COALESCE(salary, 0) AS salary FROM employees;
    

Also, because COALESCE can accept multiple arguments, it is more flexible than Oracle’s NVL or MySQL’s IFNULL.
During migration, it’s important to choose the correct function for the target database.

6. Perguntas Frequentes (FAQ)

Questions about MySQL’s IFNULL function and NULL handling are important for developers and database administrators.
This section summarizes common questions about IFNULL.

Q1. Are the IFNULL function and the NVL function the same?

They provide almost the same functionality, but the function name differs depending on the database.

DatabaseNULL-handling function
MySQLIFNULL(expression, fallback_value)
OracleNVL(expression, fallback_value)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)

In MySQL, use IFNULL; in Oracle, use NVL to convert NULL values to a fallback value.

Q2. What is the difference between IFNULL and COALESCE?

IFNULL returns the non-NULL value between two arguments, while
COALESCE returns the first non-NULL value among multiple arguments.

FunctionFeature
IFNULL(a, b)If a is NULL, return b (only two arguments)
COALESCE(a, b, c, ...)Evaluates left to right and returns the first non-NULL value

Examples

SELECT IFNULL(NULL, 'Fallback value'); -- Result: 'Fallback value'
SELECT COALESCE(NULL, NULL, 'First non-NULL value'); -- Result: 'First non-NULL value'

✔ When you should use IFNULL
✅ Return a specific default value when NULL (e.g., if NULL then 0)
✅ When you only compare two values

✔ When you should use COALESCE
✅ Retrieve the first non-NULL value (e.g., phone → email → default value)
✅ When you need to evaluate three or more values

Q3. Can IFNULL be used with data types other than numbers?

Yes. IFNULL can be used with strings, dates, numbers, and more.

Example 1: Using strings

SELECT name, IFNULL(email, 'Not registered') AS email
FROM users;

Example 2: Using dates

SELECT name, IFNULL(last_login, '2000-01-01') AS last_login
FROM users;

However, mixing different data types (such as numbers and strings) can cause errors, so be careful.

SELECT IFNULL(100, 'Error'); -- May cause an error due to different data types

Q4. Does using IFNULL reduce performance?

In general, the performance impact is minimal, but it can matter when processing large volumes of data.

  • IFNULL is usually fast because it only checks two values
  • However, heavy use of IFNULL on very large datasets (millions of rows) can affect index optimization in some cases

🔹 Performance optimization tips

  1. Set indexes appropriately
  • Queries like IFNULL(column, 0) = 100 may prevent indexes from being used in some cases
  • One approach is to store values with an appropriate default instead of NULL from the beginning
  1. IFNULL is lighter than COALESCE
  • Because COALESCE evaluates multiple values in order, IFNULL can be faster in many cases

Q5. Can you use CASE instead of IFNULL?

Yes. You can achieve similar behavior with CASE, but it becomes more verbose.

With IFNULL

SELECT name, IFNULL(salary, 0) AS salary
FROM employees;

With CASE

SELECT name,
  CASE WHEN salary IS NULL THEN 0 ELSE salary END AS salary
FROM employees;

IFNULL is concise and easy to use
CASE supports more flexible conditions (e.g., you can include non-NULL conditions as well)

Q6. Can IFNULL be used in a WHERE clause?

Yes. IFNULL can be used inside a WHERE clause.

Example: Replace NULL with a specific value when searching

SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';

This retrieves records where status is NULL.

Summary

  • IFNULL and NVL have almost the same functionality, but differ by DBMS
  • IFNULL evaluates 2 values; COALESCE evaluates multiple values
  • Works with strings, dates, numbers, and more
  • For large datasets, consider index optimization
  • You can use CASE instead of IFNULL
  • IFNULL can also be used in WHERE clauses

7. Conclusão

Neste artigo, abordamos detalhadamente a função IFNULL do MySQL, incluindo como lidar com valores NULL, como ela difere de outras funções e exemplos práticos.
Por fim, vamos revisar brevemente o que foi abordado.

7.1 O que é a função IFNULL?

  • IFNULL retorna um valor de fallback quando o valor especificado é NULL
  • Sintaxe :
    IFNULL(expression, fallback_value)
    
  • Ao evitar NULL, você pode prevenir erros de cálculo e problemas de dados ausentes

7.2 Exemplos práticos de IFNULL

  • Substitua NULL por um valor padrão (0 ou uma string específica)
    SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
    
  • Manipule corretamente cálculos que incluem NULL
    SELECT name, salary + IFNULL(bonus, 0) AS total_income FROM employees;
    
  • Converta NULL para uma string apropriada, como “Não registrado”
    SELECT id, IFNULL(email, 'Not registered') AS email FROM users;
    
  • Use em cláusulas WHERE para filtrar valores NULL
    SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
    

7.3 Diferenças entre IFNULL e COALESCE

  • IFNULL retorna o valor não-NULL entre dois argumentos
  • COALESCE retorna o primeiro valor não-NULL entre múltiplos argumentos
  • Como escolher
  • Manipulação simples de NULL → IFNULL
  • Selecionar o primeiro valor não-NULL → COALESCE

7.4 Manipulação de NULL em outros DBMS

DatabaseNULL-handling function
MySQLIFNULL(expression, fallback_value)
OracleNVL(expression, fallback_value)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)
  • O NVL da Oracle é quase o mesmo que o IFNULL do MySQL
  • PostgreSQL e SQL Server normalmente utilizam COALESCE
  • Durante a migração, você deve substituir as funções adequadamente

7.5 Desempenho e cuidados para IFNULL

  • IFNULL é mais leve que COALESCE
  • Com grandes conjuntos de dados, o desempenho pode degradar se a otimização de índices for afetada
  • Tenha cuidado para manter os tipos de dados consistentes (não misture tipos numéricos e de string)

7.6 Conclusões finais

  • No MySQL, use IFNULL para lidar corretamente com NULL
  • Você pode processar dados sem ser impactado por NULL
  • Entenda as diferenças entre COALESCE e NVL e use a função correta
  • Ao migrar entre bancos de dados, preste atenção às diferenças nas funções de tratamento de NULL