Explicação Completa Sobre Como Lidar com Valores NULL em SQL: Comportamento de Operadores e Funções

Os valores NULL em SQL desempenham um papel importante no design de banco de dados e na execução de consultas. NULL é um marcador especial que indica “ausência de valor”, permitindo que a integridade e a consistência dos dados sejam mantidas. Neste artigo, explicaremos detalhadamente desde o conceito básico de valores NULL em SQL até como lidar com esses valores usando diversos operadores e funções. Compreender o tratamento adequado de valores NULL permite a criação de consultas SQL mais robustas e eficientes.

Índice

O Que São Valores NULL

Valores NULL representam a “ausência de valor” em um banco de dados SQL. Eles não são equivalentes a “zero” ou “string vazia”, mas indicam que o dado não foi definido. Por exemplo, se um valor não for inserido em um campo no momento da entrada de dados, esse campo armazenará um valor NULL.

A Importância dos Valores NULL

Os valores NULL desempenham um papel fundamental no design e na gestão de bancos de dados. Eles permitem que dados faltantes ou desconhecidos sejam representados, mantendo a integridade dos dados.

Exemplos de Uso de Valores NULL

Abaixo está um exemplo de como valores NULL são usados.

-- Criação de Tabela
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    email VARCHAR(50)
);

-- Inserção de Dados
INSERT INTO employees (id, name, age, email) VALUES (1, 'John Doe', 30, 'john.doe@example.com');
INSERT INTO employees (id, name, age, email) VALUES (2, 'Jane Smith', NULL, 'jane.smith@example.com');
INSERT INTO employees (id, name, age, email) VALUES (3, 'Emily Jones', 25, NULL);

No exemplo acima, a idade de Jane Smith e o endereço de e-mail de Emily Jones são armazenados como valores NULL.

Operadores de Comparação e Valores NULL

Os operadores de comparação em SQL tratam os valores NULL de maneira especial. Como os valores NULL não são iguais a nenhum outro valor, operadores de comparação normais podem produzir resultados inesperados.

Operador de Comparação de Igualdade (=) e Valores NULL

Os valores NULL nunca são iguais a outro valor, então a seguinte consulta retornará FALSE.

SELECT * FROM employees WHERE age = NULL;

Essa consulta não retornará nenhum resultado.

Operador de Comparação de Diferença (!= ou <>) e Valores NULL

Os valores NULL também não são considerados diferentes de outros valores, então a consulta a seguir também retornará FALSE.

SELECT * FROM employees WHERE age != NULL;

Essa consulta também não retornará nenhum resultado.

IS NULL e IS NOT NULL

Para lidar corretamente com valores NULL, deve-se usar os operadores IS NULL e IS NOT NULL.

-- Selecionar linhas com valores NULL
SELECT * FROM employees WHERE age IS NULL;

-- Selecionar linhas sem valores NULL
SELECT * FROM employees WHERE age IS NOT NULL;

Com isso, é possível selecionar com precisão as linhas que contêm ou não contêm valores NULL.

Exemplo

A consulta a seguir seleciona os funcionários cuja idade é NULL.

SELECT * FROM employees WHERE age IS NULL;

Essa consulta retornará o registro de Jane Smith.

Operadores Lógicos e Valores NULL

Os operadores lógicos (AND, OR, NOT) em SQL aplicam regras especiais ao avaliar condições que envolvem valores NULL. Como os valores NULL são tratados como “desconhecido” (Unknown), eles podem influenciar os resultados das operações lógicas.

Operador AND e Valores NULL

O operador AND só retorna TRUE se ambas as condições forem verdadeiras. Aqui está um exemplo de avaliação envolvendo um valor NULL.

SELECT * FROM employees WHERE age > 25 AND email IS NOT NULL;

Nesta consulta, selecionamos funcionários cuja idade é maior que 25 e o e-mail não é NULL. Se a idade for NULL, a condição resultará em NULL, e nenhuma linha será retornada.

Operador OR e Valores NULL

O operador OR retorna TRUE se qualquer uma das condições for verdadeira. Veja um exemplo de avaliação com valor NULL.

SELECT * FROM employees WHERE age > 25 OR email IS NULL;

Nesta consulta, selecionamos funcionários cuja idade é maior que 25 ou cujo e-mail é NULL. Mesmo que a idade seja NULL, se o e-mail for NULL, a linha será selecionada.

Operador NOT e Valores NULL

O operador NOT inverte o valor lógico de uma condição. Quando aplicado a um valor NULL, o resultado ainda será NULL.

SELECT * FROM employees WHERE NOT (age > 25);

Esta consulta seleciona funcionários cuja idade não é maior que 25. Se a idade for NULL, o NOT (NULL) será NULL, e essa linha não será selecionada.

Exemplos Concretos de Operações Lógicas com Valores NULL

A seguir, estão exemplos concretos de operações lógicas que envolvem valores NULL.

-- Selecionar funcionários cuja idade é NULL e o e-mail não é NULL
SELECT * FROM employees WHERE age IS NULL AND email IS NOT NULL;

-- Selecionar funcionários cuja idade não é NULL ou o e-mail não é NULL
SELECT * FROM employees WHERE age IS NOT NULL OR email IS NOT NULL;

Essas consultas permitem a seleção adequada de dados, levando em conta os valores NULL.

Operadores Aritméticos e Valores NULL

Os operadores aritméticos (+, -, *, /) em SQL apresentam um comportamento especial quando envolvem valores NULL. O resultado de uma operação aritmética envolvendo um valor NULL será sempre NULL.

Adição (+) e Valores NULL

Aqui está um exemplo de adição envolvendo valores NULL.

SELECT id, name, age + 5 AS age_plus_five FROM employees;

Esta consulta cria uma nova coluna ao adicionar 5 à idade. Se age for NULL, o resultado será NULL.

Subtração (-) e Valores NULL

Aqui está um exemplo de subtração envolvendo valores NULL.

SELECT id, name, age - 5 AS age_minus_five FROM employees;

Esta consulta subtrai 5 da idade para criar uma nova coluna. Se age for NULL, o resultado será NULL.

Multiplicação (*) e Valores NULL

Aqui está um exemplo de multiplicação envolvendo valores NULL.

SELECT id, name, age * 2 AS age_times_two FROM employees;

Esta consulta cria uma nova coluna ao multiplicar a idade por 2. Se age for NULL, o resultado será NULL.

Divisão (/) e Valores NULL

Aqui está um exemplo de divisão envolvendo valores NULL.

SELECT id, name, age / 2 AS age_divided_by_two FROM employees;

Esta consulta divide a idade por 2 para criar uma nova coluna. Se age for NULL, o resultado será NULL.

Exemplos Concretos de Operações Aritméticas com Valores NULL

A seguir estão exemplos concretos de operações aritméticas que envolvem valores NULL.

-- Adicionar 10 à idade e selecionar funcionários cujo resultado não é NULL
SELECT id, name, age + 10 AS new_age FROM employees WHERE age + 10 IS NOT NULL;

-- Multiplicar a idade por 2 e selecionar funcionários cujo resultado não é NULL
SELECT id, name, age * 2 AS doubled_age FROM employees WHERE age * 2 IS NOT NULL;

Essas consultas mostram como os valores NULL afetam os resultados das operações aritméticas.

Funções e Valores NULL

O SQL oferece várias funções úteis para lidar com valores NULL. Essas funções ajudam a processar valores NULL de maneira apropriada, controlando os resultados das consultas conforme o esperado.

Função COALESCE

A função COALESCE retorna o primeiro argumento que não é NULL. É útil quando várias colunas podem conter valores NULL.

SELECT id, name, COALESCE(age, 0) AS age FROM employees;

Esta consulta retorna 0 se age for NULL.

Função NULLIF

A função NULLIF retorna NULL se os dois argumentos forem iguais, caso contrário, retorna o primeiro argumento.

SELECT id, name, NULLIF(age, 0) AS age FROM employees;

Esta consulta retorna NULL se age for 0.

Função ISNULL (exclusiva do SQL Server)

A função ISNULL substitui valores NULL por um valor especificado.

SELECT id, name, ISNULL(age, 0) AS age FROM employees;

Esta consulta retorna 0 se age for NULL.

Função IFNULL (exclusiva do MySQL)

A função IFNULL substitui valores NULL por um valor especificado.

SELECT id, name, IFNULL(age, 0) AS age FROM employees;

Esta consulta retorna 0 se age for NULL.

Exemplos de Processamento de Valores NULL com Funções

A seguir estão exemplos concretos de processamento de valores NULL com várias funções.

-- Definir 0 se a idade for NULL
SELECT id, name, COALESCE(age, 0) AS age FROM employees;

-- Retornar NULL se a idade for 0
SELECT id, name, NULLIF(age, 0) AS age FROM employees;

-- Exclusivo do SQL Server: Definir 0 se a idade for NULL
SELECT id, name, ISNULL(age, 0) AS age FROM employees;

-- Exclusivo do MySQL: Definir 0 se a idade for NULL
SELECT id, name, IFNULL(age, 0) AS age FROM employees;

Essas funções permitem o processamento flexível de valores NULL.

A Declaração CASE e Valores NULL

A declaração CASE é uma estrutura que permite retornar valores diferentes com base em condições. É útil para lidar com valores NULL e permite o processamento flexível de dados.

Estrutura Básica da Declaração CASE

A estrutura básica de uma declaração CASE é mostrada abaixo.

SELECT id, name,
    CASE 
        WHEN age IS NULL THEN 'Não Definido'
        ELSE CAST(age AS VARCHAR)
    END AS age_status
FROM employees;

Esta consulta retorna a string “Não Definido” se age for NULL, e retorna a idade como uma string se não for NULL.

Declaração CASE com Múltiplas Condições

A declaração CASE pode lidar com várias condições.

SELECT id, name,
    CASE 
        WHEN age IS NULL THEN 'Idade Desconhecida'
        WHEN age < 20 THEN 'Menos de 20 Anos'
        WHEN age BETWEEN 20 AND 30 THEN '20-30 Anos'
        ELSE 'Mais de 30 Anos'
    END AS age_category
FROM employees;

Esta consulta retorna diferentes categorias com base na idade.

Exemplos Concretos de Declarações CASE com Valores NULL

A seguir estão exemplos de como lidar com valores NULL usando a declaração CASE.

-- Tratar valores NULL como "Não Definido"
SELECT id, name,
    CASE 
        WHEN email IS NULL THEN 'E-mail Não Definido'
        ELSE email
    END AS email_status
FROM employees;

-- Categorizar a idade, retornando uma string específica para valores NULL
SELECT id, name,
    CASE 
        WHEN age IS NULL THEN 'Idade Desconhecida'
        WHEN age < 25 THEN 'Jovem'
        WHEN age BETWEEN 25 AND 35 THEN 'Meia Idade'
        ELSE 'Sênior'
    END AS age_group
FROM employees;

Essas consultas permitem classificar e exibir dados com valores NULL de maneira flexível, de acordo com as condições especificadas.

Índices e Valores NULL

Os índices são usados para melhorar o desempenho das consultas em bancos de dados. No entanto, ao criar índices em colunas que contêm valores NULL, algumas considerações importantes devem ser feitas.

Fundamentos de Índices e Valores NULL

Nos bancos de dados SQL, é possível criar índices em colunas que contêm valores NULL. No entanto, o tratamento de valores NULL pode variar entre os diferentes sistemas de bancos de dados.

Impacto no Desempenho dos Índices

Ao aplicar índices em colunas com muitos valores NULL, o tamanho do índice pode aumentar, o que pode impactar o desempenho.

Exemplo de Criação de Índice

A seguir está um exemplo de criação de índice em uma coluna que contém valores NULL.

-- Criação de Índice
CREATE INDEX idx_email ON employees(email);

-- Consulta usando o índice
SELECT * FROM employees WHERE email IS NOT NULL;

Este índice melhora a velocidade da busca por linhas onde email não é NULL.

Tratamento de Índices e Valores NULL

Em alguns sistemas de banco de dados, é possível configurar o índice para não incluir valores NULL.

-- Exemplo no PostgreSQL: Criação de índice que exclui valores NULL
CREATE INDEX idx_email_non_null ON employees(email) WHERE email IS NOT NULL;

Este índice é criado apenas para linhas onde email não é NULL.

Uso Eficiente de Índices

A seguir estão algumas práticas recomendadas para usar índices de forma eficiente em colunas que contêm valores NULL.

  • Use índices parciais para excluir valores NULL
  • Utilize índices compostos para acelerar pesquisas com base em várias colunas
  • Considere o tamanho do índice em relação ao desempenho

Exemplo de Índice Composto

A seguir está um exemplo de criação de um índice composto.

-- Criação de Índice Composto
CREATE INDEX idx_name_email ON employees(name, email);

-- Consulta usando o índice composto
SELECT * FROM employees WHERE name = 'John Doe' AND email IS NOT NULL;

Este índice composto acelera as consultas que utilizam tanto name quanto email como critérios de busca.

Exercícios Práticos

Preparamos alguns exercícios práticos para aprofundar sua compreensão sobre o tratamento de valores NULL em SQL. Através desses exercícios, você poderá verificar o comportamento de operadores e funções aplicados a valores NULL.

Exercício 1: Operações Básicas com Valores NULL

Usando a tabela abaixo, realize operações básicas com valores NULL.

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    score INT
);

INSERT INTO students (id, name, score) VALUES (1, 'Alice', 85);
INSERT INTO students (id, name, score) VALUES (2, 'Bob', NULL);
INSERT INTO students (id, name, score) VALUES (3, 'Charlie', 78);
INSERT INTO students (id, name, score) VALUES (4, 'David', NULL);

Questão 1.1

Crie uma consulta que selecione os estudantes cujas notas são NULL.

-- Exemplo de Resposta
SELECT * FROM students WHERE score IS NULL;

Questão 1.2

Crie uma consulta que selecione os estudantes cujas notas não são NULL.

-- Exemplo de Resposta
SELECT * FROM students WHERE score IS NOT NULL;

Exercício 2: Uso da Função COALESCE

Crie uma consulta que use a função COALESCE para retornar 0 quando a nota for NULL.

-- Exemplo de Resposta
SELECT id, name, COALESCE(score, 0) AS score FROM students;

Exercício 3: Uso da Declaração CASE

Crie uma consulta que use a declaração CASE para mostrar “Não Definido” se a nota for NULL, “Aprovado” se a nota for 70 ou superior, e “Reprovado” para todas as outras notas.

-- Exemplo de Resposta
SELECT id, name,
    CASE 
        WHEN score IS NULL THEN 'Não Definido'
        WHEN score >= 70 THEN 'Aprovado'
        ELSE 'Reprovado'
    END AS result
FROM students;

Exercício 4: Condições Compostas e Valores NULL

Crie uma consulta que selecione estudantes com nota superior ou igual a 70 e cujo nome seja ‘Charlie’. Certifique-se de incluir uma condição para garantir que a nota não seja NULL.

-- Exemplo de Resposta
SELECT * FROM students WHERE score >= 70 AND name = 'Charlie' AND score IS NOT NULL;

Esses exercícios ajudam a consolidar o entendimento sobre as operações em SQL envolvendo valores NULL.

Conclusão

O tratamento de valores NULL em SQL é crucial para o design de bancos de dados e a criação de consultas. Valores NULL representam “ausência de valor” e são tratados de forma especial em relação a outros valores. Neste artigo, discutimos o comportamento dos operadores e funções com valores NULL, como lidar com índices e também oferecemos exemplos práticos de uso.

Compreender e lidar corretamente com valores NULL melhora a consistência dos dados e a eficiência das consultas. Além disso, ser capaz de criar consultas que considerem valores NULL permite maior flexibilidade ao trabalhar com dados reais.

Abaixo estão os pontos principais deste artigo:

  • Conceito básico de valores NULL: Valores NULL indicam “ausência de valor”.
  • Operadores de comparação e lógicos: Valores NULL não são iguais a outros valores; use IS NULL e IS NOT NULL para comparações.
  • Operadores aritméticos: Operações aritméticas com valores NULL sempre retornam NULL.
  • Funções: Use funções como COALESCE e NULLIF para processar valores NULL.
  • Declaração CASE: A declaração CASE permite lidar com valores NULL de maneira condicional.
  • Índices: Considere os cuidados ao criar índices em colunas com valores NULL.

Utilize esses conhecimentos para criar consultas SQL mais robustas e eficientes ao lidar com valores NULL.

Índice