SóProvas


ID
5206192
Banca
CESGRANRIO
Órgão
Banco da Amazônia
Ano
2021
Provas
Disciplina
Banco de Dados
Assuntos

Um programador experiente estava revisando o código de um estagiário e detectou a instrução SQL abaixo, complicada demais para seu objetivo.

SELECT * FROM Compras where codProduto not in (select codProduto from Produtos where codProduto<3 or valor<4000)

Para simplificar o código, sem alterar a resposta, a instrução apresentada acima pode ser substituída por

Alternativas
Comentários
  • Essa questão está comentada em vídeo na prática e passo a passo no youtube no canal do Qcom - Questão comentada

    https://youtu.be/1TgE_GGqedY

    Basta selecionar os maiores ou iguais a 3 e maiores ou iguais a 4

  • É quase uma questão de RML. 

    P = codProduto<3

    Q = valor<4000

    ¬(P ou Q) = ¬P e ¬Q = codProduto>=3 e valor>=4000

  • d-

    ____________________________________________________

    1- sempre se inicia da subquery:

    (select codProduto from Produtos where codProduto<3 or valor<4000)

    o que ele quer é codProduto menor que 3. codProduto pode ser 0,1,2 etc.

    ou.

    valor menor que 4000. pode ser 3999,2000,1000 etc.

    ____________________________________________________

    2- o NOT IN nega tudo dentro da subquery. logo:

    or -> and

    codProduto < 3 -> codProduto >= 3

    valor<4000 -> valor>=4000

  • Achei a semântica estranha. Na descrição o valor é referente ao Produto e nas alternativas referente à Compra, sendo que a compra poderia ter um valor diferente se tiver mais de um produto. Então as queries não teriam o mesmo resultado.
  • A questão cobra o entendimento do operador IN/NOT IN. O NOT IN retorna verdadeiro para todos aqueles valores do atributo à esquerda do comando que não estão presentes na lista de valores entre parênteses. No item em tela, os valores dessa lista entre parênteses são dados por outra consulta, a seguinte:

    select codProduto from Produtos where codProduto<3 or valor<4000

    Essa consulta retorna todos os valores de codProduto para os quais o codProduto é < 3 ou o valor do produto é < 4000.

    Então, a consulta principal irá retornar todos os valores de codProduto que não estão nessa lista, já que é um NOT IN. Ou seja, todos os valores de CodProduto, cujo atributo codProduto não é menor que três (ou seja que é >= 3) e cujo atributo valor não é menor que 4000 (ou seja, que é >= 4000). O comando equivalente, entã, é o seguinte:

    SELECT * FROM Compras where codProduto>=3 and valor>=4000

  • SELECT * FROM Compras where codProduto not in (select codProduto from Produtos where codProduto<3 or valor<4000

    Não são as mesmas tabelas. Cade o join?