Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2023

Banco de DadosConsultas e Comandos em SQL
Código
ce397762
Banca
CESPE / CEBRASPE
Órgão
TC DF
Ano
2023
Cargo
ACE ( )
Julgue o item que se segue, a respeito de SQL e das técnicas para detecção de problemas e otimização de desempenho do SGDB e de consultas SQL.   Considere-se o trecho de código em SQL a seguir.   create table tabela (a integer, b numeric(4,2), c char(10)); insert into tabela (a,b,c) values (4,3,5); insert into tabela (a,c) values (5,5); insert into tabela (b,c) values (5,3); insert into tabela (c) values (7); insert into tabela (b) values (7); select avg(a),avg(b) from tabela;   Executando-se esse código, obtém-se o resultado a seguir.Imagem associada para resolução da questão
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL: comportamento de AVG com valores NULL

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:

  1. insert into tabela (a,b,c) values (4,3,5); → insere a linha (4, 3.00, '5')

  2. insert into tabela (a,c) values (5,5); → insere a linha (5, NULL, '5')

  3. insert into tabela (b,c) values (5,3); → insere a linha (NULL, 5.00, '3')

  4. insert into tabela (c) values (7); → insere a linha (NULL, NULL, '7')

  5. 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.

NÃO CAIA NESSA!

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.

1Comportamento com NULL
AVG, SUM, COUNT, MAX, MIN
Ignoram valores nulos
COUNT(*) conta todas as linhas
2Cálculo da média
Soma apenas não nulos
Divide pelos não nulos
3Erro comum
Tratar NULL como zero
Dividir pelo total de linhas
Funções de agregação SQL
LEVELsoulevel.com.br
Funções de agregação SQL: Comportamento com NULL (AVG, SUM, COUNT, MAX, MIN, Ignoram valores nulos, COUNT(*) conta todas as linhas); Cálculo da média (Soma apenas não nulos, Divide pelos não nulos); Erro comum (Tratar NULL como zero, Dividir pelo total de linhas)

Item — ❌ Errado

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