Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FCC 2019

Banco de DadosSQL
Código
fc053974
Banca
FCC
Órgão
Prefeitura de Manaus - AM
Ano
2019
Cargo
Assistente Técnico de Tecnologia da Informação - Programador
Considere a existência de duas tabelas relacionadas em um banco de dados: Pedidos e Transportador. A tabela Pedidos possui 2 campos numéricos: PedidoID (chave primária) e TransportadorID (chave estrangeira). A tabela Transportador possui o campo TransportadorID (chave primária, numérico) e TransportadorNome (cadeia de caracteres). Para listar o número de Pedidos de cada Transportador utiliza-se a instrução SQL:
  1. ASELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS “NumeroPedidos” FROM Pedidos RIGHT JOIN FROM Pedidos ON Pedidos.TransportadorID = Transportador.TransportadorID ORDER BY TransportadorNome;
  2. BSELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS NumeroPedidos FROM Pedidos FULL JOIN Transportador WHERE Pedidos.TransportadorID = Transportador.TransportadorID GROUP BY TransportadorNome;
  3. CSELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS “NumeroPedidos” FROM Pedidos, Transportador INNER JOIN ON Pedidos.TransportadorID = Transportador.TransportadorID GROUP BY TransportadorNome;
  4. DSELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS NumeroPedidos FROM Pedidos LEFT JOIN Transportador ON Pedidos.TransportadorID = Transportador.TransportadorID ORDER BY TransportadorNome;
  5. ESELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS NumeroPedidos FROM Pedidos LEFT JOIN Transportador ON Pedidos.TransportadorID = Transportador.TransportadorID GROUP BY TransportadorNome;
Revelar gabarito e comentário

GabaritoE — SELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS NumeroPedidos FROM Pedidos LEFT JOIN Transportador ON Pedidos.TransportadorID = Transportador.TransportadorID GROUP BY TransportadorNome;

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: LEFT JOIN com GROUP BY

Gabarito: letra E. Para listar o número de pedidos de cada transportador, é necessário usar LEFT JOIN (ou RIGHT JOIN) para garantir que todos os transportadores sejam incluídos (ou, dependendo da necessidade, que todos os pedidos sejam considerados), e GROUP BY para agregar por transportador, além da função COUNT sobre o identificador do pedido. A alternativa E atende a esses requisitos com a sintaxe correta: SELECT Transportador.TransportadorNome, COUNT(Pedidos.PedidoID) AS NumeroPedidos FROM Pedidos LEFT JOIN Transportador ON Pedidos.TransportadorID = Transportador.TransportadorID GROUP BY TransportadorNome;.

NÃO CAIA NESSA!

A banca troca a cláusula GROUP BY por ORDER BY na alternativa D, fazendo o candidato achar que está correta. Sem o agrupamento, a função COUNT conta todas as linhas do resultado, não por transportador. Fique atento: sempre que houver função de agregação, verifique se há GROUP BY para agrupar corretamente.

Alternativa

JOIN utilizado

Sintaxe correta?

Agrupamento (GROUP BY)?

Função de agregação (COUNT) correta?

Resultado esperado

A

RIGHT JOIN

❌ (erro: RIGHT JOIN FROM Pedidos)

❌ (falta GROUP BY)

Não compila

B

FULL JOIN

❌ (usa WHERE em vez de ON)

✅ (GROUP BY presente)

Produto cartesiano antes da filtragem

C

INNER JOIN (misturado com vírgula)

❌ (sintaxe inválida)

✅ (GROUP BY presente)

Não compila

D

LEFT JOIN

❌ (usa ORDER BY em vez de GROUP BY)

❌ (COUNT conta todas as linhas)

Contagem total, não por transportador

E

LEFT JOIN

✅ (GROUP BY presente)

Contagem correta por transportador

1JOIN correto
LEFT JOIN (todos transportadores)
ON (condição de junção)
2Agregação
GROUP BY TransportadorNome
COUNT(Pedidos.PedidoID)
3Erros comuns
ORDER BY no lugar de GROUP BY
FULL JOIN desnecessário
Sintaxe mista (vírgula + JOIN)
SQL: LEFT JOIN com GROUP BY
LEVELsoulevel.com.br
SQL: LEFT JOIN com GROUP BY: JOIN correto (LEFT JOIN (todos transportadores), ON (condição de junção)); Agregação (GROUP BY TransportadorNome, COUNT(Pedidos.PedidoID)); Erros comuns (ORDER BY no lugar de GROUP BY, FULL JOIN desnecessário, Sintaxe mista (vírgula + JOIN))

Alternativa A — ❌ Incorreta

Apresenta erro de sintaxe: RIGHT JOIN FROM Pedidos não faz sentido (join deve ser entre duas tabelas, não com a mesma tabela). Além disso, falta a referência à tabela Transportador no FROM e a cláusula ON está posicionada incorretamente. Não compila.

Alternativa B — ❌ Incorreta

Utiliza FULL JOIN que não é adequado para o problema (traria registros de ambas as tabelas sem correspondência) e, mais grave, a sintaxe está errada: FULL JOIN Transportador WHERE ... — a condição de junção deve ser especificada com ON, não com WHERE. Além disso, o uso de WHERE no lugar de ON pode gerar um produto cartesiano antes da filtragem. Mesmo corrigindo, o FULL JOIN não é necessário.

Alternativa C — ❌ Incorreta

Mistura a sintaxe antiga (vírgula no FROM) com INNER JOIN, o que é inválido. A cláusula INNER JOIN ON não tem condição especificada. Não executaria.

Alternativa D — ❌ Incorreta

Embora use LEFT JOIN com ON corretamente, utiliza ORDER BY TransportadorNome em vez de GROUP BY. Sem GROUP BY, a função COUNT contaria todas as linhas do resultado, não por transportador. Além disso, a cláusula ORDER BY após SELECT sem agregação não faz sentido para o objetivo.

Alternativa E — ✅ Correta ⟵ GABARITO

A sintaxe está correta: LEFT JOIN entre Pedidos e Transportador com condição ON, GROUP BY TransportadorNome para agrupar por transportador, e COUNT(Pedidos.PedidoID) para contar os pedidos de cada grupo. Os nomes das colunas são qualificados com o nome da tabela, evitando ambiguidade. Essa query retornará o nome do transportador e a quantidade de pedidos associados a ele (apenas transportadores que têm pelo menos um pedido; se houver pedidos sem transportador, aparecerão com nome NULL).

PEGA ESSA DICA!

Em consultas que pedem contagem de itens por uma entidade (ex.: número de pedidos por transportador), lembre-se de usar GROUP BY na coluna de agrupamento e a função de agregação (COUNT, SUM, etc.) sobre a coluna que deseja contar. A direção do JOIN (LEFT/RIGHT) depende se você quer incluir entidades sem ocorrências (ex.: transportadores sem pedidos). Se o enunciado pedir "cada transportador", geralmente espera-se que todos apareçam, então o ideal seria FROM Transportador LEFT JOIN Pedidos. Mas a banca considerou correta a alternativa E, que parte de Pedidos. Na prova, fique atento ao contexto.

Gabarito: letra E. A alternativa E é a única com sintaxe SQL válida e que agrupa corretamente os dados.

Link permanente: /questoes/fc053974