Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024
Banco de Dados›Consultas 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?
Aselect tab_a.v from tab_b, tab_a order by a.v desc
Bselect v from tab_b where v = (select v from tab_a) order by 1 desc
Cselect v from tab_b where v in (select v from tab_a) order by v desc
Dselect v from tab_a where v not IN (select v from tab_b) order by 1
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
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.