SóProvas


ID
1403980
Banca
FGV
Órgão
TJ-BA
Ano
2015
Provas
Disciplina
Banco de Dados
Assuntos

Considere uma tabela relacional S, cuja instância é mostrada a seguir.

                       A           C
                       1        NULL
                       3            8
                       5            8

Sabendo-se que “NULL ” denota um valor não preenchido, analise os comandos SQL a seguir.

I.
select distinct s1.*
from s s1, s s2
where s1.a < s2.c

II.
select distinct s1.*
from s s1
where exists
       (select * from s s2
       where s1.a != s2.c)

III.
select distinct s1.*
from s s1, s s2
where s1.a != s2.c

IV.
select * from s

Resultados com o mesmo conteúdo do resultado do comando IV são produzidos:

Alternativas
Comentários
  • Também não entendi ?

  • Como o I trará mesmo resultado que o IV se há um valor NULL e estão usando o operador ' < '? Para testar um valor NULL utiliza-se as  cláusulas IS NULL ou IS NOT NULL.

    "[..] um valor desconhecido não pode ser comparado logicamente com outro valor" (Fonte: https://technet.microsoft.com/pt-br/library/ms191270%28v=sql.105%29.aspx )

  • Gabarito do site esta errado. Gabarito da banca é letra D. A I esta errada pela justificativa da colega Lais Marques

  • Procurei la no gabarito e nao achei sequer esse cargo (Analista Judiciario - TI), mas a explicacao da colega Lais esta correta

  • O comando I não iria funcionar, pois, Segundo o W3School:

    It is not possible to test for NULL values with comparison operators, such as =, <, or <>.

    We will have to use the IS NULL and IS NOT NULL operators instead.

    http://www.w3schools.com/sql/sql_null_values.asp
  • A resposta certa segundo gabarito da Banca é realmente a E:


    Prova: http://netstorage.fgv.br/tjba/TJBAHIA_Analista_Judiciario_-_Area_de_Apoio_Especializado_-_Especialidade_-_Tecnologia_da_Informacao_(ANJU-TIN)_Tipo_1.pdf



    Porém, este é o gabarito preliminar, sem considerar os possíveis recursos. O gabarito definitivo não existe, pois esta prova precisou ser reaplicada.
  • Realmente equivoquei-me. Gabarito é a letra E. As três consultas retornam o mesmo resultado pelo menos para o MySQL. Veja em: http://sqlfiddle.com/#!9/83010/11 o resultado do SQL da I.

  • Esta questão é bastante complexa. Infelizmente tem resposta, entretanto esse é o tipo de comando sql que é considerado errado do ponto de vista semântico uma vez que NULL não é nada, ou seja, seu resultado é indeterminado e somos instruídos a evitar de construir consultas complexas baseadas em comparações justamente com o valor NULL. Para mim isto deveria ser anulado! Não testa o conhecimento de SQL.

  • Resolvendo a primeira consulta:

    O produto cartesiano formado é o seguinte:

    A(s1) C(s1) A(s2) C(s2)

    1 - null - 1 - null

    3 - 8 - 1 - null

    5 - 8 - 1 - null

    1 - null - 3 - 8

    3 - 8 - 3 - 8

    5 - 8 - 3 - 8

    1 - null - 5 - 8

    3 - 8 - 5 - 8

    5 - 8 - 5 - 8

    Depois da cláusula WHERE apenas as linhas em negrito restarão.

    Considerando que ele só quer s1* e DISTINCT temos

    1 - null

    3 - 8

    5 - 8



  • @kleber Santos, neguei sua solução até o último momento, mas vc está certo. A cláusula WHERE descarta as linhas que têm o valor NULL na coluna s2.C. A comparação é estranha, mas o resultado é simples: o descarte da linha correspondente. As colunas s1.C que têm valor NULL permanecem porque não sofrem comparações. Quanto a s1.* e DISTINCT não há dúvidas.

     

    Obrigado pela ajuda. :-)

  • "!=" funcionou no meu teste no Sql Server, bem como todas as consutlas trouxeram o mesmo resultado.

  • Decorem:  Operações que envolvem  NULL

     

    - Not NULL => NULL

    -NULL or False => NULL

    - NULL or True => True

    - NULL or NULL => NULL

    - NULL and False => False

    - NULL and True => NULL

    - NULL and NULL => NULL
     

  • GABARITO CORRETO É LETRA E

     

    http://sqlfiddle.com/#!18/a3de6/8