Pular para o conteúdo principal

Questão de Banco de Dados — SQL Server — FGV 2023

Banco de DadosSQL Server
Código
fg060701
Banca
FGV
Órgão
CGE-SC
Ano
2023
Nível
Superior
Cargo
Auditor do Estado - Ciências da Computação - Tarde (Conhecimentos Específicos)
Considere os clientes de uma loja cadastrados em um SGBDR Microsoft SQL Server, e a necessidade de sortear um cliente para receber um prêmio. O administrador resolve realizar o sorteio através de um código Transact-SQL (TSQL).Dos códigos a seguir, identifique o que irá realizar o sorteio de forma imparcial.
  1. ADECLARE @sorteado varchar(35)select top 1 @sorteado = NomeClientefrom Cliente;SELECT @sorteado AS 'Cliente sorteado'
  2. BDECLARE @sorteado varchar(35)select top NomeCliente @sorteado = NomeClientefrom Cliente;SELECT @sorteado AS 'Cliente sorteado'
  3. CDECLARE @sorteado varchar(35)select top 1 @sorteado = NomeClientefrom Cliente order by row_number( );SELECT @sorteado AS 'Cliente sorteado'
  4. DDECLARE @sorteado varchar(35)select top 1 @sorteado = NomeClientefrom Cliente order by newid( );SELECT @sorteado AS 'Cliente sorteado'
  5. EDECLARE @sorteado varchar(35)select top 1 @sorteado = NomeClientefrom Cliente group by NomeClientehaving count(*) = 1;SELECT @sorteado AS 'Cliente sorteado'
Revelar gabarito e comentário

GabaritoD — DECLARE @sorteado varchar(35) select top 1 @sorteado = NomeCliente from Cliente order by newid( ); SELECT @sorteado AS 'Cliente sorteado'

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

SELECT aleatório no SQL Server com T-SQL

Gabarito: letra D. Para realizar um sorteio imparcial, é necessário ordenar os registros de forma aleatória. No SQL Server, a função NEWID() gera um valor GUID único a cada execução, e ao usá-la na cláusula ORDER BY, cada linha recebe um valor aleatório diferente, tornando a ordenação não determinística. O SELECT TOP 1 então retorna um registro aleatório. Nenhuma das outras alternativas produz aleatoriedade genuína.

A banca testa o conhecimento da sintaxe de consultas aleatórias no Transact-SQL. A função NEWID() é a forma padrão e eficiente de obter uma linha aleatória de uma tabela no SQL Server.

Alternativa A — ❌ Incorreta

Não possui cláusula ORDER BY. O SELECT TOP 1 sem ordenação retorna a primeira linha física da tabela, que é previsível e dependente do plano de execução e da organização dos dados. Não há aleatoriedade.

Alternativa B — ❌ Incorreta

A sintaxe SELECT TOP NomeCliente é inválida: TOP exige um número inteiro. Mesmo que fosse corrigida, faltaria ORDER BY, resultando no mesmo problema da alternativa A.

Alternativa C — ❌ Incorreta

ORDER BY row_number() é inválido: a função ROW_NUMBER() precisa de uma cláusula OVER() para definir particionamento e ordenação. Além disso, mesmo se funcionasse, ROW_NUMBER() atribui números sequenciais conforme uma ordenação pré-determinada, não aleatória. Portanto, não gera um sorteio imparcial.

Alternativa D — ✅ Correta ⟵ GABARITO

Utiliza ORDER BY NEWID(). NEWID() retorna um identificador único (GUID) a cada chamada e, por ser essencialmente aleatório, a ordenação resultante também o é. Assim, o TOP 1 seleciona uma linha aleatória, garantindo imparcialidade no sorteio.

Alternativa E — ❌ Incorreta

GROUP BY NomeCliente HAVING COUNT(*) = 1 filtra apenas os clientes que aparecem uma única vez (sem duplicatas). Pode excluir clientes repetidos indevidamente e, ainda assim, sem ORDER BY, retorna uma linha previsível (a primeira do grupo resultante). Não há aleatoriedade.

PEGA ESSA DICA!

Para selecionar uma linha aleatória no SQL Server, o padrão é SELECT TOP 1 coluna FROM tabela ORDER BY NEWID(). Em tabelas muito grandes, considere o desempenho, pois NEWID() é chamado para cada linha antes da ordenação. Alternativas como TABLESAMPLE existem, mas não garantem uniformidade. Lembre-se de que funções como RAND() são calculadas uma vez por consulta e não servem para ordenação aleatória de linhas.

Gabarito: letra D.

Link permanente: /questoes/fg060701