Voltar para a lista de artigos Artigos
5 minutos de leitura

Valores NULL e o GROUP BY Cláusula

Já abordamos como usar a cláusula GROUP BY e algumas funções de agregação como SUM(), AVG(), MAX(), MIN(), COUNT(). Neste artigo, explicaremos como o GROUP BY A cláusula NULL funciona quando se trata de valores NULL. Também explicaremos sobre o uso de NULLscom a cláusula ORDER BY.

A melhor maneira de dominar GROUP BY e NULL em SQL é através da prática. Eu recomendo o Trilha de Práticas em SQL faixa em LearnSQL.com.br. Ela contém mais de 600 exercícios práticos para ajudá-lo a ganhar confiança em suas habilidades.

Em SQL, NULL é um marcador especial usado para indicar que um valor de dados não existe no banco de dados. Para mais detalhes, veja a explicação da Wikipedia sobre NULL em SQL.

Usaremos o seguinte employee tabela para ilustrar como o GROUP BY A cláusula funciona com valores NULL.

EMPLOYEE TABLE
EmplidNameDepartmentSalary
100John Smith IT 2000
101Jean Pellu NULL 2500
102Mary Popins FINANCES2000
103Blas MerrieuNULL NULL
104Joan Piquet IT 1000
105Jose Gomez IT NULL

O GROUP BY Cláusula e Valores NULL

Vamos começar executando uma simples consulta SQL com a cláusula GROUP BY e os valores NULL:

SELECT department 
FROM employee 
GROUP BY department;
RESULTADOS
department
1.	
2.	IT
3.	FINANCES

Nota: Adicionei aqui uma lista numerada para maior clareza; normalmente os resultados seriam mostrados como uma lista não numerada.

Podemos ver que o primeiro valor de resultado é um NULL representado por uma linha vazia (a linha vazia perante o departamento de TI). Este espaço vazio representa todos os valores NULL retornados pela cláusula GROUP BY, portanto podemos concluir que GROUP BY trata os NULLs como valores válidos.

Na próxima consulta, contaremos quantos funcionários estão em cada departamento, incluindo o departamento "NULL":

SELECT department, count(*) 
FROM employee 
GROUP BY department;
RESULTADOS
department		count(*)
1. 			2
2. IT        		3
3. FINANCES 		1

Nota: Adicionei aqui uma lista numerada para maior clareza; normalmente os resultados seriam mostrados como uma lista não numerada.

Analisando os resultados anteriores a partir de uma cláusula "GROUP BY perspectiva", podemos concluir que todos os valores NULL estão agrupados em um valor ou balde. Isto faz parecer que a NULL é um departamento com dois funcionários. Entretanto, tratar os valores NULL desta forma - agrupando muitos NULLs em um balde - não se alinha com o conceito de que um valor NULL não é igual a nenhum outro valor, mesmo outro NULL.

Para explicar por que os NULLs estão agrupados em um balde, precisamos rever o padrão SQL. SQL define "quaisquer dois valores que sejam iguais um ao outro, ou quaisquer dois NULLs", como "não distintos". Esta definição de "não distinto" permite a SQL agrupar e ordenar NULLs quando a cláusula GROUP BY (ou outras palavras-chave que realizam o agrupamento) é utilizada.

Há outro ponto confuso no resultado anterior: a forma como o NULL é representado (por uma linha em branco) não é clara. Uma maneira interessante de resolver esta questão é usar a função COALESCE, que converte NULLs para um valor específico, mas deixa outros valores inalterados. Vejamos a seguinte consulta:

SELECT coalesce(department,'Unassigned department'), count(*) 
FROM employee 
GROUP BY 1;
RESULTADOS
department			count(*)
IT				3
Unassigned department	        2
FINANCES			1

Funções Agregadas e Valores Nulos

Até agora temos trabalhado com os valores NULL na coluna do departamento, e temos usado apenas a cláusula GROUP BY. Vamos tentar executar algumas consultas usando os valores NULL como parâmetros em funções agregadas. Primeiro, vamos usar a função COUNT():

SELECT COUNT(salary) as "Salaries"
FROM employee
RESULTADOS
Salaries
     4

Sem a cláusula DISTINCT, COUNT(salary) retorna o número de registros que têm valores não-NULL (2000, 2500, 2000, 1000) na coluna de salários. Portanto, podemos concluir que COUNT não inclui os valores NULL.

Vamos tentar usar o COUNT(distinct column) função agregada, que conta todos os valores diferentes em uma coluna. Como isso trata os valores NULL?

SELECT COUNT(distinct salary) as "Different Salaries"
FROM employee
RESULTADOS
Different Salaries
	3

A consulta retornou um "3", mas há quatro salários diferentes: 2000, 2500, 1000, e NULL. Mais uma vez, podemos concluir que o NULL não está incluído no valor resultante.

Vejamos outro exemplo, desta vez utilizando a função agregada AVG():

SELECT coalesce(department,'Unassigned department'), AVG(salary) 
FROM employee 
GROUP BY 1
RESULTADOS
department			count(*)
Unassigned department    	2500
IT				1500
FINANCES			2000

Vamos analisar se os valores NULL estão incluídos na função AVG(). O departamento de TI tem três funcionários com os seguintes valores salariais: 2000, 1000, e NULL. O resultado de AVG para TI é 1500, portanto é claro que o valor NULL não é considerado no cálculo da média. (Porque (1000 + 2000 ) / 2 = 1500.)

A conclusão é que as médias só são calculadas utilizando valores não NULL. A regra geral é que os valores NULL não são considerados em nenhuma função agregada como SUM(), AVG(), COUNT(), MAX() e MIN(). A exceção a esta regra é a regra COUNT(*) que conta todas as filas, mesmo aquelas com valores NULL. Aqui está um exemplo:

SELECT COUNT(*) as "Total Records"
FROM employee
RESULTADOS
Total Records
         6

Como podemos ver, COUNT(*) retorna o número total de registros no "employee"tabela, mesmo aqueles registros com valores NULL em alguns ou todos os campos.

O ORDEM POR Cláusula e Valores Nulos

O padrão SQL não define explicitamente uma ordem de ordenação padrão para NULLs. Alguns bancos de dados como Oracle e PostgreSQL utilizam uma especificação NULLS FIRST ou NULLS LAST para indicar o lugar do valor NULL. O exemplo a seguir mostra esta característica:

SELECT department, COUNT(*) as "Num of employees" , AVG(salary) as "Avg Dept. Salary"
FROM employee
GROUP BY department
ORDER BY department NULLS LAST
RESULTADOS
department			Num of employees		Avg Dept. Salary
FINANCES			1				2000
IT				3				1500
				2				2500

Expressões Booleanas envolvendo NULLS

Normalmente vemos VERDADEIRO ou FALSO como um resultado Booleano, mas é comum que expressões ou condições que incluem um NULL devolvam um resultado NÃO CONHECIDO. O resultado UNKNOWN é abordado em detalhes em outro artigo que publicamos anteriormente aqui em nosso blog.

EXPERIMENTE VOCÊ MESMO!

Há muitas características e funções de banco de dados relacionais que produzem um comportamento específico sempre que um valor NULL está envolvido. Você pode aprender mais no curso LearnSQL's Funções Comuns em SQL. Experimente de graça!