Como lidar corretamente com registros contendo NULL no SQL: Como usar as funções MAX/MIN

A presença de valores NULL é um problema inevitável ao trabalhar com bancos de dados em SQL. Isso é especialmente importante ao usar funções agregadas como MAX ou MIN, onde o tratamento de NULL se torna crucial. Neste artigo, começaremos explicando o conceito básico de NULL, seguido por como lidar com ele no SQL, e como aplicar as funções MAX e MIN em conjuntos de dados que incluem NULL. Isso ajudará a melhorar a precisão da análise de dados e da administração do banco de dados.

Índice

O que é NULL?

NULL é um marcador especial que indica “ausência de valor” em um banco de dados. NULL é diferente de zero ou de uma string vazia, significando “desconhecido” ou “não aplicável”. A presença de NULL indica falta de dados ou que algum campo ainda não foi preenchido, o que significa que certas colunas ou registros no banco de dados não têm valores atribuídos.

Como tratar NULL no SQL

Em SQL, NULL é tratado como um valor especial, e vários cuidados são necessários. NULL não pode ser comparado diretamente com operadores de comparação (= ou <>) e requer condições especiais. Além disso, ao realizar operações aritméticas ou usar funções agregadas, é importante considerar como NULL será tratado. A seguir, explicaremos alguns pontos básicos sobre como lidar com NULL no SQL.

Comparando NULL

NULL não pode ser comparado diretamente usando operadores de igualdade. Para comparar NULL, usamos IS NULL ou IS NOT NULL. Por exemplo, para obter registros em que uma coluna contém NULL, você pode usar a seguinte consulta:

SELECT * FROM NomeDaTabela WHERE NomeDaColuna IS NULL;

Operações com NULL

Qualquer operação aritmética que inclua NULL resultará em NULL. Por exemplo, ao somar um número com NULL, o resultado será NULL. Compreender essa propriedade é importante para garantir que cálculos envolvendo NULL produzam os resultados esperados.

Funções agregadas e NULL

Funções agregadas (como SUM, AVG, MAX e MIN) ignoram valores NULL ao realizar cálculos. No entanto, se for necessário levar NULL em consideração, você precisará tratar esses valores de maneira apropriada.

Como usar as funções MAX/MIN

As funções MAX e MIN são funções agregadas em SQL usadas para obter o valor máximo ou mínimo de uma coluna especificada. Essas funções são úteis para identificar o maior ou menor valor em uma coluna específica.

Sintaxe básica da função MAX

A função MAX retorna o valor máximo de uma coluna especificada. A sintaxe básica é a seguinte:

SELECT MAX(NomeDaColuna) FROM NomeDaTabela;

Exemplo:

SELECT MAX(Preço) FROM Produtos;

Esta consulta retorna o valor máximo da coluna “Preço” na tabela “Produtos”.

Sintaxe básica da função MIN

A função MIN retorna o valor mínimo de uma coluna especificada. A sintaxe básica é a seguinte:

SELECT MIN(NomeDaColuna) FROM NomeDaTabela;

Exemplo:

SELECT MIN(Preço) FROM Produtos;

Esta consulta retorna o valor mínimo da coluna “Preço” na tabela “Produtos”.

Agrupamento com MAX/MIN

As funções MAX e MIN são frequentemente usadas em combinação com a cláusula GROUP BY para calcular o valor máximo ou mínimo dentro de grupos específicos.

SELECT Categoria, MAX(Preço) FROM Produtos GROUP BY Categoria;

Esta consulta agrupa os produtos pela “Categoria” e retorna o preço máximo em cada grupo.

Comportamento de MAX/MIN em conjuntos de dados com NULL

É importante entender como as funções MAX e MIN se comportam quando há valores NULL no conjunto de dados. Essas funções ignoram os valores NULL ao fazer cálculos.

Comportamento da função MAX com NULL

A função MAX ignora valores NULL ao calcular o valor máximo. Por exemplo, considere o seguinte conjunto de dados:

SELECT * FROM Produtos;
ID do ProdutoPreço
1100
2NULL
3200
4150

Ao executar a seguinte consulta:

SELECT MAX(Preço) FROM Produtos;

O resultado será 200. Os valores NULL são ignorados e tratados como inexistentes.

Comportamento da função MIN com NULL

Da mesma forma, a função MIN também ignora valores NULL ao calcular o valor mínimo. Usando o mesmo conjunto de dados acima, ao executar a seguinte consulta:

SELECT MIN(Preço) FROM Produtos;

O resultado será 100. Assim como o MAX, o MIN ignora valores NULL e os trata como inexistentes.

Exemplo prático

Para verificar o comportamento quando NULL está presente, vamos criar a seguinte tabela:

CREATE TABLE DadosDeExemplo (  
    ID INT,  
    Valor INT  
);  

INSERT INTO DadosDeExemplo (ID, Valor) VALUES (1, 10), (2, NULL), (3, 30), (4, 20);

Agora, ao executar a seguinte consulta:

SELECT MAX(Valor), MIN(Valor) FROM DadosDeExemplo;

O resultado será o seguinte:

MAX(Valor)MIN(Valor)
3010

Como você pode ver, as funções MAX e MIN ignoram os valores NULL ao realizar cálculos.

Como ignorar NULL

Existem várias maneiras de fazer com que as funções MAX e MIN ignorem valores NULL ao realizar cálculos no SQL. Isso assegura que os valores NULL não afetem os resultados.

Usando a cláusula WHERE para filtrar NULL

Antes de executar a consulta, você pode usar a cláusula WHERE para excluir valores NULL. Por exemplo, podemos evitar registros com NULL assim:

SELECT MAX(Valor) FROM DadosDeExemplo WHERE Valor IS NOT NULL;

Essa consulta calcula o valor máximo ignorando qualquer valor NULL.

Usando a condição IS NOT NULL

Da mesma forma, você pode usar a cláusula WHERE com a função MIN para ignorar valores NULL.

SELECT MIN(Valor) FROM DadosDeExemplo WHERE Valor IS NOT NULL;

Essa consulta ignora NULL e calcula o valor mínimo.

Outra maneira de excluir NULL

Em alguns casos, você pode usar subconsultas para excluir valores NULL. Veja o exemplo a seguir:

SELECT MAX(Valor) FROM (SELECT Valor FROM DadosDeExemplo WHERE Valor IS NOT NULL) AS DadosFiltrados;

Essa consulta cria uma subconsulta que exclui valores NULL e, em seguida, calcula o valor máximo.

Como substituir NULL por um valor específico

Em SQL, você pode usar a função COALESCE para substituir valores NULL por um valor específico. Isso permite realizar cálculos com um valor adequado no lugar de NULL.

Sintaxe básica da função COALESCE

A função COALESCE retorna o primeiro valor não-nulo de uma lista de expressões. A sintaxe básica é a seguinte:

COALESCE(expressão1, expressão2, ..., expressãoN)

Nessa sintaxe, o primeiro valor não-nulo de expressão1 a expressãoN será retornado.

Exemplo prático

Por exemplo, para substituir valores NULL por 0, você pode usar a seguinte consulta:

SELECT COALESCE(Valor, 0) FROM DadosDeExemplo;

Essa consulta retorna 0 sempre que encontrar um valor NULL.

Substituindo NULL por 0 e obtendo o valor máximo

SELECT MAX(COALESCE(Valor, 0)) FROM DadosDeExemplo;

Essa consulta retorna o valor máximo substituindo valores NULL por 0.

Substituindo NULL por uma string específica

Também é possível substituir valores NULL em colunas de texto por uma string específica.

SELECT COALESCE(Nome, 'Desconhecido') FROM Usuarios;

Essa consulta retorna ‘Desconhecido’ quando o valor de “Nome” for NULL.

Especificando múltiplos valores para substituir NULL

A função COALESCE permite especificar várias expressões, e o primeiro valor não-nulo será retornado.

SELECT COALESCE(Valor1, Valor2, 0) FROM DadosDeExemplo;

Nessa consulta, se Valor1 for NULL, será retornado Valor2, e se ambos forem NULL, será retornado 0.

Exemplo prático: Como lidar com dados de vendas contendo NULL

Aqui, vamos demonstrar como usar as funções MAX e MIN em um conjunto de dados de vendas que inclui valores NULL.

Criando um conjunto de dados de exemplo

Primeiro, criamos uma tabela contendo dados de vendas e inserimos alguns registros:

CREATE TABLE Vendas (  
    IDProduto INT,  
    ValorVenda INT  
);  

INSERT INTO Vendas (IDProduto, ValorVenda) VALUES  
(1, 1000),  
(2, 1500),  
(3, NULL),  
(4, 2000),  
(5, NULL),  
(6, 2500);

Essa tabela contém registros onde o valor de venda é NULL.

Obtendo o valor máximo e mínimo ignorando NULL

Agora, vamos calcular o valor máximo e mínimo, ignorando os registros onde o valor de venda é NULL:

SELECT MAX(ValorVenda) AS MaxVenda, MIN(ValorVenda) AS MinVenda  
FROM Vendas  
WHERE ValorVenda IS NOT NULL;

Essa consulta considera apenas os registros onde o valor de venda não é NULL e calcula o valor máximo e mínimo.

Resultado

MaxVendaMinVenda
25001000

Substituindo NULL por 0 e obtendo o valor máximo e mínimo

Se quisermos considerar valores NULL como 0 no cálculo, podemos usar a função COALESCE:

SELECT MAX(COALESCE(ValorVenda, 0)) AS MaxVenda, MIN(COALESCE(ValorVenda, 0)) AS MinVenda  
FROM Vendas;

Essa consulta substitui valores NULL por 0 antes de calcular o valor máximo e mínimo.

Resultado

MaxVendaMinVenda
25000

Substituindo NULL por um valor específico e calculando

Por exemplo, se quisermos substituir valores NULL pela média das vendas, podemos fazer da seguinte forma:

WITH MediaVenda AS (  
    SELECT AVG(ValorVenda) AS Media  
    FROM Vendas  
    WHERE ValorVenda IS NOT NULL  
)  
SELECT MAX(COALESCE(ValorVenda, (SELECT Media FROM MediaVenda))) AS MaxVenda,  
       MIN(COALESCE(ValorVenda, (SELECT Media FROM MediaVenda))) AS MinVenda  
FROM Vendas;

Essa consulta substitui valores NULL pela média das vendas antes de calcular o valor máximo e mínimo.

Exemplos práticos e exercícios

A seguir, apresentamos alguns exemplos práticos e exercícios para aprofundar sua compreensão sobre como lidar com dados que contêm NULL no SQL.

Exemplo prático 1: Agregação de dados de vendas por mês

Vamos agregar os dados de vendas mensais, incluindo valores NULL, e calcular a venda máxima e mínima para cada mês.

CREATE TABLE VendasMensais (  
    Mes INT,  
    ValorVenda INT  
);  

INSERT INTO VendasMensais (Mes, ValorVenda) VALUES  
(1, 1000),  
(1, 1500),  
(1, NULL),  
(2, 2000),  
(2, NULL),  
(2, 2500);  

SELECT Mes, MAX(COALESCE(ValorVenda, 0)) AS MaxVenda, MIN(COALESCE(ValorVenda, 0)) AS MinVenda  
FROM VendasMensais  
GROUP BY Mes;

Essa consulta substitui NULL por 0 e calcula a venda máxima e mínima para cada mês.

Exemplo prático 2: Valor médio de compra por cliente

Vamos calcular o valor médio de compra por cliente, substituindo valores NULL por 0.

CREATE TABLE HistoricoDeCompras (  
    IDCliente INT,  
    ValorCompra INT  
);  

INSERT INTO HistoricoDeCompras (IDCliente, ValorCompra) VALUES  
(1, 1000),  
(1, NULL),  
(2, 1500),  
(2, 2000),  
(3, NULL);  

WITH MediaCliente AS (  
    SELECT IDCliente, AVG(COALESCE(ValorCompra, 0)) AS MediaCompra  
    FROM HistoricoDeCompras  
    GROUP BY IDCliente  
)  
SELECT IDCliente, MediaCompra  
FROM MediaCliente;

Essa consulta calcula o valor médio de compra para cada cliente, considerando os valores NULL como 0.

Exercícios

  1. Na tabela “Pedidos”, calcule o valor máximo e mínimo dos pedidos, considerando 100 como o valor mínimo para pedidos que têm NULL no campo de valor do pedido.
CREATE TABLE Pedidos (  
    IDPedido INT,  
    ValorPedido INT  
);  

INSERT INTO Pedidos (IDPedido, ValorPedido) VALUES  
(1, 500),  
(2, NULL),  
(3, 1500),  
(4, 2000),  
(5, NULL);  

-- Escreva sua consulta aqui.
  1. Na tabela “Produtos”, calcule o estoque máximo e mínimo por categoria, substituindo NULL por -1 nos registros de estoque.
CREATE TABLE Produtos (  
    IDProduto INT,  
    Categoria VARCHAR(50),  
    Estoque INT  
);  

INSERT INTO Produtos (IDProduto, Categoria, Estoque) VALUES  
(1, 'A', 100),  
(2, 'A', NULL),  
(3, 'B', 200),  
(4, 'B', NULL),  
(5, 'C', 300);  

-- Escreva sua consulta aqui.

Conclusão

Lidar corretamente com dados que contêm valores NULL é uma habilidade fundamental na manipulação de bancos de dados. Ao usar as funções MAX e MIN, é importante estar ciente de como NULL é tratado. Compreender como ignorar NULL ou substituí-lo por valores específicos permite obter resultados de agregação mais precisos. Com os exemplos práticos e exercícios, você poderá aplicar essas técnicas de maneira eficaz e melhorar significativamente a precisão na administração de bancos de dados e na análise de dados.

Índice