Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025
- Código
- qa698949
- Banca
- Quadrix
- Órgão
- CRM MS
- Ano
- 2025
- Cargo
- Ana ( )
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: CERTO (letra C). O comando apresentado está correto: ele retorna o nome de cada médico e a quantidade de atendimentos realizados, incluindo médicos sem atendimento (com contagem zero, graças ao LEFT JOIN), e ordena o resultado da maior para a menor quantidade de atendimentos (ORDER BY COUNT(...) DESC). A sintaxe está de acordo com o padrão SQL e com a maioria dos SGBDRs relacionais.
O comando SELECT é a instrução da linguagem SQL responsável por consultar dados. Ele combina várias cláusulas que definem o resultado: SELECT (colunas a exibir), FROM (tabela de origem), JOIN (combinação com outra tabela), GROUP BY (agrupamento de linhas para agregação) e ORDER BY (ordenação do resultado). Nesta questão, o objetivo é contar quantos atendimentos cada médico realizou, o que exige agrupar os registros por médico e usar a função de agregação COUNT.
O LEFT JOIN (ou LEFT OUTER JOIN) é o ponto central da questão. Ele retorna todas as linhas da tabela à esquerda (no caso, Medicos), mesmo que não haja correspondência na tabela à direita (Atendimentos). Quando não há correspondência, as colunas da tabela à direita ficam com valor NULL. Isso garante que médicos que ainda não realizaram nenhum atendimento também apareçam no resultado, com contagem zero. Se fosse usado um INNER JOIN, esses médicos seriam omitidos — uma diferença crucial que a banca explora.
A função COUNT(A.id_atendimento) conta apenas os valores não nulos da coluna id_atendimento. Como o LEFT JOIN preenche com NULL as colunas de Atendimentos para médicos sem atendimento, o COUNT retorna 0 para esses médicos — exatamente o comportamento desejado. Se a contagem fosse COUNT(*), ela contaria também as linhas com NULL, retornando 1 para médicos sem atendimento, o que seria um erro sutil.
O GROUP BY M.nome agrupa as linhas pelo nome do médico, permitindo que a função COUNT seja aplicada a cada grupo. Uma observação importante: em SQL padrão, quando se usa GROUP BY, todas as colunas não agregadas no SELECT devem aparecer no GROUP BY. Aqui, M.nome é a única coluna não agregada e está corretamente no GROUP BY. Se houvesse dois médicos com o mesmo nome, eles seriam agrupados juntos — uma limitação do comando, mas não um erro de sintaxe.
Por fim, o ORDER BY COUNT(A.id_atendimento) DESC ordena os grupos pela contagem em ordem decrescente, ou seja, do médico com mais atendimentos para o com menos. A palavra-chave DESC (de descending) é o que garante a ordem decrescente; sem ela, o padrão seria ASC (crescente). O comando está, portanto, completo e correto.
A banca pode tentar confundir o candidato trocando o LEFT JOIN por INNER JOIN. Com INNER JOIN, médicos sem atendimento seriam excluídos do resultado, o que mudaria o sentido da consulta. Outra pegadinha comum é usar COUNT(*) em vez de COUNT(A.id_atendimento), o que contaria linhas com NULL e retornaria 1 para médicos sem atendimento. Fique atento a essas trocas sutis.
O comando está correto por três razões principais:
LEFT JOIN garante que todos os médicos apareçam, mesmo sem atendimentos, com contagem zero.
COUNT(A.id_atendimento) conta apenas atendimentos efetivos (não nulos), produzindo o número correto por médico.
ORDER BY COUNT(A.id_atendimento) DESC ordena do maior para o menor número de atendimentos, como pedido no enunciado.
A sintaxe é válida no padrão SQL e em SGBDRs como MySQL, PostgreSQL, SQL Server e Oracle. Não há erro de digitação, cláusula mal posicionada ou função incorreta. O comando atende exatamente ao que se propõe.
Gabarito: letra C (CERTO).
Link permanente: /questoes/qa698949