Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — INSTITUTO AOCP 2024

Banco de DadosConsultas e Comandos em SQL
Código
qa630619
Banca
INSTITUTO AOCP
Órgão
TRF 2
Ano
2024
Cargo
TJ TRF2

Considere a tabela PEDIDO com os atributos pedido_id, cliente_id, data_pedido, e total, e a tabela CLIENTE com os atributos cliente_id, nome e cidade. Um técnico necessita encontrar os clientes que têm pedidos com valor total acima da média dos pedidos de todos os clientes da mesma cidade. Para resolver esse problema, o técnico decide utilizar subqueries. Em relação ao tema, analise as assertivas e assinale a alternativa que aponta as corretas.

 

I. Uma subquery pode ser utilizada na cláusula SELECT, no contexto apresentado, para calcular a média dos pedidos por cidade.

 

II. Uma subquery pode ser utilizada na cláusula FROM para criar uma tabela derivada contendo a média dos pedidos por cidade.

 

III. Uma subquery pode ser utilizada na cláusula WHERE para filtrar clientes com pedidos acima da média dos pedidos da mesma cidade.

 

IV. Uma subquery pode ser utilizada na cláusula GROUP BY para agrupar os pedidos por cidade e calcular a média dos pedidos.


  1. AApenas I e II.
  2. BApenas II e III.
  3. CApenas II e IV.
  4. DApenas III e IV.
  5. EI, II, III e IV.
Revelar gabarito e comentário

GabaritoB — Apenas II e III.

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

Subqueries em SQL: onde podem ser usadas

Gabarito: letra B. As assertivas corretas são II e III: uma subquery pode ser usada na cláusula FROM para criar uma tabela derivada com a média por cidade, e na cláusula WHERE para filtrar clientes com pedidos acima da média da própria cidade. A assertiva I está incorreta porque, embora uma subquery escalar possa aparecer no SELECT, ela não é a forma adequada para calcular a média por cidade no contexto apresentado (exigiria correlação e retornaria apenas um valor por linha, não por cidade). A assertiva IV está incorreta porque a cláusula GROUP BY não aceita subqueries — ela apenas agrupa linhas, e o cálculo da média é feito com a função de agregação AVG.

Uma subquery (ou subconsulta) é uma consulta aninhada dentro de outra consulta SQL. Ela pode aparecer em diferentes cláusulas, cada uma com um propósito específico. No problema proposto — encontrar clientes com pedidos acima da média dos pedidos da mesma cidade — a solução clássica usa uma subquery correlacionada na cláusula WHERE, que compara o total de cada pedido com a média calculada para a cidade daquele cliente. Alternativamente, pode-se usar uma subquery na cláusula FROM para criar uma tabela derivada com as médias por cidade e depois fazer um JOIN com a tabela de pedidos.

A cláusula SELECT aceita subqueries escalares (que retornam um único valor), mas usá-la para calcular a média por cidade exigiria uma subquery correlacionada que, para cada linha, calcularia a média da cidade correspondente — algo tecnicamente possível, mas ineficiente e não é a abordagem natural para o problema. A cláusula GROUP BY, por sua vez, não aceita subqueries: ela apenas define os grupos, e o cálculo da média é feito pela função AVG aplicada a cada grupo.

A distinção crucial é entre onde a subquery pode aparecer sintaticamente e onde ela é semanticamente adequada. A banca explora exatamente essa confusão: o candidato pode achar que a subquery no SELECT é válida (é, mas não resolve o problema de forma eficiente) e que a subquery no GROUP BY é possível (não é, pois GROUP BY não aceita subqueries).

NÃO CAIA NESSA!

A banca troca a cláusula que aceita subquery pela que não aceita. O candidato pode confundir a subquery no SELECT (que é escalar e retorna um único valor) com a necessidade de calcular a média por cidade (que exige agrupamento). E pode achar que GROUP BY aceita subquery, quando na verdade ele apenas agrupa linhas — o cálculo da média é feito com AVG, não com subquery.

Subqueries em SQL
  • 1Onde podem aparecer
    • SELECT
      • Escalar (retorna 1 valor)
      • Inadequada p/ média por cidade
    • FROM
      • Tabela derivada
      • Média por cidade + JOIN
    • WHERE
      • Correlacionada
      • Filtra acima da média da cidade
    • GROUP BY
      • Não aceita subquery
      • Agrupa linhas + AVG
LEVEL · soulevel.com.br

Item I — ❌ Incorreto

Uma subquery pode ser usada na cláusula SELECT, mas apenas como subquery escalar, retornando um único valor. No contexto apresentado, calcular a média dos pedidos por cidade exigiria uma subquery correlacionada que, para cada linha, calcularia a média da cidade correspondente — algo tecnicamente possível, mas ineficiente e não é a abordagem natural. A forma correta de calcular a média por cidade é usar GROUP BY com AVG, não uma subquery no SELECT.

Item II — ✅ Correto

Uma subquery na cláusula FROM cria uma tabela derivada (derived table), que pode conter a média dos pedidos por cidade. Por exemplo:

SELECT c.nome, p.total
FROM cliente c
JOIN pedido p ON c.cliente_id = p.cliente_id
JOIN (SELECT cidade, AVG(total) AS media
      FROM cliente
      JOIN pedido ON cliente.cliente_id = pedido.cliente_id
      GROUP BY cidade) m ON c.cidade = m.cidade
WHERE p.total > m.media;

Essa é uma abordagem válida e eficiente para o problema.

Item III — ✅ Correto

Uma subquery na cláusula WHERE pode filtrar clientes com pedidos acima da média da mesma cidade, usando uma subquery correlacionada. Por exemplo:

SELECT c.nome, p.total
FROM cliente c
JOIN pedido p ON c.cliente_id = p.cliente_id
WHERE p.total > (SELECT AVG(p2.total)
                 FROM pedido p2
                 JOIN cliente c2 ON p2.cliente_id = c2.cliente_id
                 WHERE c2.cidade = c.cidade);

Essa é a abordagem clássica e mais direta para o problema.

Item IV — ❌ Incorreto

A cláusula GROUP BY não aceita subqueries. Ela apenas agrupa linhas com base em uma ou mais colunas. O cálculo da média é feito pela função de agregação AVG aplicada a cada grupo, não por uma subquery. A sintaxe correta seria GROUP BY cidade seguido de SELECT cidade, AVG(total), sem subquery.

Gabarito: letra B — corretos os itens II e III.

Link permanente: /questoes/qa630619