X ...
a b c d
1 2 1 2
3 3 3 4
4 5 5 6
5 7 7 8
9 1
select x.a from x
where not exists
(select * from y where y.c = x.a+1)
Considerando-se as tabelas e o comando SQL mostrados acima, é correto concluir que esse comando produz um resultado com uma única coluna contendo somente o(s) valor(es):
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: C - 1, 3, 5
Para resolver essa questão, precisamos entender o conceito de subconsulta (ou subquery) e a cláusula NOT EXISTS em SQL. A subconsulta está sendo utilizada para verificar a existência de uma condição em outra tabela. A cláusula NOT EXISTS retorna verdadeiro se a subconsulta não retornar nenhum resultado.
O comando SQL dado está selecionando valores da coluna a da tabela X, mas somente para os registros que não possuem um correspondente na tabela Y onde Y.c é igual a X.a + 1. Ou seja, estamos procurando por valores de a na tabela X que, quando incrementados por 1, não sejam encontrados na coluna c da tabela Y.
Vamos verificar cada valor de a em X:
- 1: Não existe um valor c em Y que seja igual a 2 (1+1), então 1 é selecionado.
- 3: Não existe um valor c em Y que seja igual a 4 (3+1), então 3 é selecionado.
- 4: Existe um valor c em Y que é igual a 5 (4+1), então 4 não é selecionado.
- 5: Não existe um valor c em Y que seja igual a 6 (5+1), então 5 é selecionado.
Portanto, os valores selecionados da coluna a da tabela X são 1, 3, e 5, o que corresponde à alternativa C.
Essa questão avalia a compreensão dos conceitos de subconsulta e da operação NOT EXISTS em SQL, que são essenciais para realizar consultas condicionais avançadas em bancos de dados.
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
where not exists > vai excluir dos números acima, os que retornarem na expressão abaixo
(select * from y where y.c = x.a+1) > y.c = x.a+1 vai retornar 4. Porque: quando se soma 1 a cada elemento de x.a as linhas ficam, 2,4,5,6. O único número nessa sequencia que se encontra em y.c é o 5, que está na 3ª linha. Assim a expressão vai retornar o número de x.a que se encontra na 3ª linha, que é o 4. (não é a soma, que seria 5, a soma é só para referenciar)
O comando no fim vai tirar do primeiro select os números encontrados no segundo, neste caso apenas o 4, por força do not exists.
Na realidade ouve um erro na digitação faltando parenteses na clausula not exists, assim o comando ficaria select x.a from x where (NOT EXISTS (select * from y where y.c = x.a+1));
Logo, select x.a from x retorna 1,3,4,5. O comando select * from y where y.c = x.a+1 retorna 4, mas a clausula Not Exists reverte isso para 1,3,5.
Justificando resposta da letra C.
select * from y where y.c = x.a+1 retorna 4?
O que significa esse a+1?
E como retorna 4 se o select * é para retornar algum registro de y?
Vamos na fé.
Dentro das restrições, como WHERE (Seleção da álgebra relacional), pode-se utilizar expressões aritméticas, afim de personalizar a consulta.
Aqui no caso o examinador que saber se dentro da tabela Y, na coluna C, existe alguma ocorrência que seja igual a uma ocorrência da coluna A da tabela X, mais 1.
Por exemplo: Para a primeira ocorrência da tabela X. No caso o número 1. O banco de dados vai somar 1+1, logo 2. E vai procurar na coluna C da tabela Y, se existe alguma ocorrência de valor = 2. Como se pode observar, não haverá nenhum dado com esse valor, logo o retorno da consulta será vazio. Como a cláusula NOT EXISTS espera um valor vazio, ela trona-se verdadeira e o número 1 (primeira ocorrência da tabela X, que é nosso dado em evidência) será apresentado na consulta externa. O mesmo ocorre com 3 e 5.
Para o 4, temos uma ocorrência de número 5 na tabela Y, coluna C, que é resultado de 4+1.
Espero ter ajudado.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo