Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2023
- Código
- ce397762
- Banca
- CESPE / CEBRASPE
- Órgão
- TC DF
- Ano
- 2023
- Cargo
- ACE ( )

- CCerto
- EErrado

GabaritoE — Errado
Gabarito: Errado. A consulta select avg(a), avg(b) from tabela não retorna os valores indicados na imagem, pois as funções de agregação AVG ignoram valores nulos ao calcular a média. Como as colunas a e b possuem registros nulos, a média é calculada apenas sobre os valores não nulos, o que torna o resultado diferente do apresentado.
A questão testa um dos comportamentos mais importantes e frequentemente cobrados em SQL: o tratamento de valores NULL em funções de agregação. Diferentemente do que muitos candidatos imaginam, as funções AVG, SUM, COUNT, MAX e MIN ignoram os valores nulos em seus cálculos. Isso significa que, ao calcular a média de uma coluna, o SGBD soma apenas os valores não nulos e divide pela quantidade de valores não nulos, e não pelo número total de linhas da tabela. Vamos analisar o código passo a passo. A tabela tabela é criada com três colunas: a (integer), b (numeric(4,2)) e c (char(10)). Em seguida, são executados cinco comandos INSERT, cada um inserindo uma linha com valores em algumas colunas e deixando outras com NULL:
insert into tabela (a,b,c) values (4,3,5); → insere a linha (4, 3.00, '5')
insert into tabela (a,c) values (5,5); → insere a linha (5, NULL, '5')
insert into tabela (b,c) values (5,3); → insere a linha (NULL, 5.00, '3')
insert into tabela (c) values (7); → insere a linha (NULL, NULL, '7')
insert into tabela (b) values (7); → insere a linha (NULL, 7.00, NULL)
Após essas inserções, a tabela fica com 5 linhas. Para a coluna a, os valores são: 4, 5, NULL, NULL, NULL. Para a coluna b, os valores são: 3.00, NULL, 5.00, NULL, 7.00. Agora, a consulta select avg(a), avg(b) from tabela é executada. A função AVG(a) calcula a média dos valores não nulos da coluna a, ou seja, (4 + 5) / 2 = 4.5. A função AVG(b) calcula a média dos valores não nulos da coluna b, ou seja, (3.00 + 5.00 + 7.00) / 3 = 5.00. Portanto, o resultado correto da consulta é 4.5 para avg(a) e 5.00 para avg(b). Esse é o erro clássico que a banca explora: o candidato que não conhece o comportamento de NULL em agregações tende a calcular a média dividindo pelo número total de linhas, incluindo as nulas, o que leva a um resultado incorreto.
A banca explora a confusão entre considerar valores nulos como zero e ignorá-los no cálculo da média. Muitos candidatos somam todos os valores (tratando nulo como 0) e dividem pelo número total de linhas, obtendo avg(a) = (4+5+0+0+0)/5 = 1.8 e avg(b) = (3+0+5+0+7)/5 = 3.0. No entanto, o correto é ignorar os nulos: avg(a) = (4+5)/2 = 4.5 e avg(b) = (3+5+7)/3 = 5.0. Essa é uma pegadinha recorrente em provas de SQL.
Para fixar o entendimento, veja a tabela comparativa:
Coluna | Valores (incluindo nulos) | Valores não nulos | Média correta (ignora nulos) | Média errada (nulo = 0) |
|---|---|---|---|---|
a | 4, 5, NULL, NULL, NULL | 4, 5 | (4+5)/2 = 4.5 | (4+5+0+0+0)/5 = 1.8 |
b | 3.00, NULL, 5.00, NULL, 7.00 | 3.00, 5.00, 7.00 | (3+5+7)/3 = 5.00 | (3+0+5+0+7)/5 = 3.00 |
O mesmo princípio se aplica a outras funções de agregação. Por exemplo, COUNT(coluna) conta apenas os valores não nulos, enquanto COUNT(*) conta todas as linhas. SUM também ignora nulos. Esse comportamento é padrão na linguagem SQL e é fundamental para interpretar corretamente resultados de consultas com dados ausentes.
A afirmação de que o código produz o resultado mostrado na imagem é incorreta. O resultado correto da consulta é avg(a) = 4.5 e avg(b) = 5.00, pois as funções de agregação ignoram valores nulos. Qualquer resultado que considere os nulos como zero ou que divida pelo número total de linhas (incluindo as nulas) está errado. Portanto, o item está errado. Gabarito: Errado.
Link permanente: /questoes/ce397762