Considere os comandos SQL a seguir.I.select r.* FROM R where...

Próximas questões
Com base no mesmo assunto
Q873280 Banco de Dados
Considere os comandos SQL a seguir. I. select r.* FROM R where exists (select * FROM S where r.a = s.c) II. select r.* FROM R where (select count(*) FROM S where r.a = s.c) > 0
III. select r.* FROM R where r.a in (select c FROM S)
IV. select r.* FROM R where exists (select 1 FROM S where r.a = s.c)
V. select distinct r.* FROM R, S where r.a = s.c
Sabe-se que quatro desses comandos sempre produzem resultados com conteúdos idênticos, mesmo considerando-se diferentes instâncias de R e S.
O comando que NÃO faz parte desse grupo é:
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: E.

A questão trata sobre a equivalência lógica entre diferentes comandos SQL, que visam selecionar dados de uma tabela baseando-se na existência de correspondência em outra tabela. Os conhecimentos necessários para resolver a questão estão voltados para a compreensão de subconsultas, a cláusula EXISTS, o operador IN, a contagem de resultados através da função COUNT(*) e o entendimento de junções de tabelas.

As alternativas de I a IV empregam técnicas distintas para atingir o mesmo resultado, ou seja, selecionar todos os registros da tabela R que possuem correspondência na tabela S:

  • EXISTS verifica se existe ao menos uma linha que satisfaça a condição especificada;
  • COUNT(*) maior que zero verifica se há ao menos uma correspondência, similar ao EXISTS;
  • IN seleciona as linhas de R onde o valor de a corresponde a qualquer valor da coluna c retornada pela subconsulta da tabela S;
  • O uso de SELECT 1 também é uma variação do EXISTS, onde o que importa é a existência da linha, não o valor retornado pela subconsulta.

No entanto, a alternativa E utiliza uma junção implícita entre as tabelas R e S, junto com o uso de DISTINCT para eliminar duplicatas. Apesar de buscar a correspondência entre as colunas a de R e c de S, como nas outras alternativas, a forma como a junção é feita pode resultar em múltiplas linhas para uma única linha de R, se houver mais de uma correspondente em S. O uso do DISTINCT pode eliminar duplicidades resultantes da junção, mas não muda o fato de que a junção pode combinar uma única linha de R com várias linhas de S, potencialmente gerando mais linhas antes da aplicação do DISTINCT do que as subconsultas usadas nas outras alternativas. Portanto, a alternativa E, apesar de poder ter um resultado visualmente semelhante após a aplicação do DISTINCT, realiza um processo diferente para chegar ao resultado final e, por isso, tem um comportamento distinto quando comparada às alternativas de I a IV.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

distinct

Em SQL é uma clásula que:

Retorna os registros distintos de uma mesma tabela

Ignora os repetidos

 

Letra E

Por que a segunda opção está correta? O count vai retornar um número de registros, ou não?

I, II e IV são iguais, mas o III não é igual. I, II e IV é: "retorne TUDO da tabela R se ouver alguma relação entre R e S", já o III é: "Retorne APENAS  os registro de R que tiverem relação com S". Estou errado? Alguém poderia me explicar?

Não entendi essa questão, alguém me explica? 

Tanto o count quanto o in tem a mesma função que o exists em suas cláusulas, validam a condição para que o select seja realizado.

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo