Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024

Banco de DadosConsultas e Comandos em SQL
Código
qa630749
Banca
FUNDATEC
Órgão
CRF RS
Ano
2024
Cargo
Prog ( )
Um banco de dados Oracle contém as duas tabelas abaixo, chamadas de tab_a e tab_b, ambas com um campo numérico v: Um programador executou um comando SQL e obteve a resposta abaixo: Qual comando o programador executou?Imagem associada para resolução da questãoImagem associada para resolução da questão
  1. Aselect tab_a.v from tab_b, tab_a order by a.v desc
  2. Bselect v from tab_b where v = (select v from tab_a) order by 1 desc
  3. Cselect v from tab_b where v in (select v from tab_a) order by v desc
  4. Dselect v from tab_a where v not IN (select v from tab_b) order by 1
  5. Eselect v from tab_b where v not in (select v from tab_a)
Revelar gabarito e comentário

GabaritoC — select v from tab_b where v in (select v from tab_a) order by v desc

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

Consultas SQL: IN, NOT IN e subconsultas

Gabarito: letra C. O comando select v from tab_b where v in (select v from tab_a) order by v desc é o único que retorna exatamente os valores da tabela tab_b que também existem em tab_a, ordenados de forma decrescente — que é o resultado apresentado na imagem. A chave está no operador IN, que filtra os registros de tab_b cujo valor de v esteja presente no conjunto retornado pela subconsulta sobre tab_a.

O comando SELECT é a instrução da sublinguagem DQL (Data Query Language) — embora alguns autores o classifiquem dentro da DML — e serve para consultar dados. Sua estrutura básica é SELECT colunas FROM tabela WHERE condição ORDER BY coluna [ASC|DESC]. O WHERE filtra as linhas antes da projeção, e o ORDER BY ordena o resultado final, sendo ASC (ascendente) o padrão quando nada é especificado. Para ordenar de forma decrescente, usa-se DESC.

A questão trabalha com dois conceitos centrais: o operador IN e a subconsulta. O IN verifica se um valor pertence a uma lista de valores — que pode ser literal (IN (1, 2, 3)) ou resultado de uma subconsulta (IN (SELECT v FROM tab_a)). Ele é semanticamente equivalente a uma série de comparações com OR: v = 1 OR v = 2 OR v = 3. Já o NOT IN é a negação: retorna as linhas cujo valor não está na lista. A subconsulta, por sua vez, é um SELECT aninhado dentro de outro comando, e pode ser usada com operadores como =, >, <, IN, NOT IN, EXISTS, entre outros.

Um ponto que confunde muitos candidatos é a diferença entre IN e =. O operador = exige que a subconsulta retorne exatamente um valor (uma linha e uma coluna); se retornar mais de um, o banco dispara um erro. Já o IN aceita uma lista de qualquer tamanho. Na alternativa B, por exemplo, where v = (select v from tab_a) só funcionaria se tab_a tivesse uma única linha — o que não é o caso, pois a tabela contém vários valores.

Outra distinção importante é entre IN e NOT IN. Enquanto o IN retorna os valores que estão na lista, o NOT IN retorna os que não estão. A alternativa E usa NOT IN, o que traria os valores de tab_b que não aparecem em tab_a — resultado diferente do apresentado. Além disso, a alternativa E não possui ORDER BY, então a ordem das linhas seria indefinida, enquanto a resposta mostra uma ordenação decrescente.

A pegadinha da banca está em inverter a lógica do IN/NOT IN e em omitir ou alterar a ordenação. O candidato que não domina a semântica desses operadores pode facilmente marcar a alternativa E, que tem sintaxe válida mas retorna o conjunto complementar. Guarde a fronteira: IN = pertence ao conjunto; NOT IN = não pertence ao conjunto. É exatamente nessa distinção que as alternativas se dividem.

Operador

Semântica

Resultado típico

IN

Pertence ao conjunto (interseção)

Valores de tab_b que existem em tab_a

NOT IN

Não pertence ao conjunto (diferença)

Valores de tab_b que não existem em tab_a

= (com subconsulta)

Comparação pontual

Exige subconsulta de uma única linha; erro se retornar múltiplas

1IN
pertence ao conjunto
equivale a vários OR
2NOT IN
não pertence ao conjunto
retorna o complemento
3= (igualdade)
exige subconsulta de 1 valor
erro se retornar vários
4ORDER BY
ASC (padrão)
DESC (decrescente)
Operadores de subconsulta
LEVELsoulevel.com.br
Operadores de subconsulta: IN (pertence ao conjunto, equivale a vários OR); NOT IN (não pertence ao conjunto, retorna o complemento); = (igualdade) (exige subconsulta de 1 valor, erro se retornar vários); ORDER BY (ASC (padrão), DESC (decrescente))

Alternativa A — ❌ Incorreta

O comando select tab_a.v from tab_b, tab_a order by a.v desc apresenta dois erros. Primeiro, a cláusula FROM lista duas tabelas (tab_b, tab_a) sem condição de junção no WHERE, o que gera um produto cartesiano — cada linha de tab_b combinada com cada linha de tab_a. Isso multiplicaria o número de resultados, não correspondendo à resposta. Segundo, a referência a.v no ORDER BY usa um alias a que não foi definido no comando — o correto seria tab_a.v ou definir o alias na cláusula FROM. Além disso, a projeção select tab_a.v traz apenas os valores de tab_a, não os de tab_b.

Alternativa B — ❌ Incorreta

O comando select v from tab_b where v = (select v from tab_a) order by 1 desc usa o operador = com uma subconsulta. Esse operador exige que a subconsulta retorne um único valor (uma linha e uma coluna). Como tab_a contém vários registros, a execução geraria um erro do tipo "single-row subquery returns more than one row". Mesmo que funcionasse, a semântica seria de comparação pontual, não de pertinência a um conjunto. O order by 1 ordena pela primeira coluna do resultado, o que é válido, mas o erro na subconsulta invalida o comando.

Alternativa C — ✅ Correta ⟵ GABARITO

O comando select v from tab_b where v in (select v from tab_a) order by v desc está correto. O WHERE v IN (SELECT v FROM tab_a) filtra as linhas de tab_b cujo valor de v pertence ao conjunto de valores de v em tab_a — exatamente a interseção entre as duas tabelas. O ORDER BY v DESC ordena o resultado de forma decrescente, que é o que aparece na imagem da resposta. A sintaxe é válida no Oracle e em qualquer SGBD relacional.

Alternativa D — ❌ Incorreta

O comando select v from tab_a where v not IN (select v from tab_b) order by 1 consulta a tabela tab_a e filtra os valores que não estão em tab_b — ou seja, retorna a diferença tab_a - tab_b, não a interseção. Além disso, a ordenação order by 1 é ascendente (padrão), enquanto a resposta mostra ordem decrescente. Mesmo que a ordenação fosse DESC, o conjunto de valores seria diferente do apresentado.

Alternativa E — ❌ Incorreta

O comando select v from tab_b where v not in (select v from tab_a) retorna os valores de tab_b que não existem em tab_a — o complemento da interseção. Esse é o distrator mais perigoso, pois a sintaxe é válida e a lógica é oposta à correta. Além disso, não há cláusula ORDER BY, então a ordem das linhas seria indefinida, enquanto a resposta mostra uma ordenação decrescente. A banca explora exatamente a confusão entre IN e NOT IN.

A regra de ouro para levar à prova: IN = pertence ao conjunto (interseção); NOT IN = não pertence (diferença). E ORDER BY ... DESC para ordem decrescente, ASC (padrão) para crescente.

Gabarito: letra C

Link permanente: /questoes/qa630749