Considere o seguinte script SQL ANSI para responder à próxima questão.
Ao analisar a consulta SQL ANSI a seguir:É correto afirmar que seu objetivo é apresentar o código e o título dos projetos armazenados na tabela
ADESENVOLVIMENTO_TECNOLOGICO que se não se relacionam à tabela PROJETO_PESQUISA.
BDESENVOLVIMENTO_TECNOLOGICO que se relacionam ou não à tabela PROJETO_PESQUISA.
CPROJETO_PESQUISA que estão ou não relacionados a tuplas da tabela DESENVOLVIMENTO_TECNOLOGICO.
DPROJETO_PESQUISA que não estão relacionados a nenhuma tupla da tabela DESENVOLVIMENTO_TECNOLOGICO.
EPROJETO_PESQUISA relacionados a projetos que possuem ocorrências na tabela DESENVOLVIMENTO_TECNOLOGICO.
Revelar gabarito e comentário▾
GabaritoD — PROJETO_PESQUISA que não estão relacionados a nenhuma tupla da tabela DESENVOLVIMENTO_TECNOLOGICO.
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”.
SQL: junção externa esquerda (LEFT JOIN) e registros sem correspondência
Gabarito: letra D. A consulta usa um LEFT JOIN entre PROJETO_PESQUISA e DESENVOLVIMENTO_TECNOLOGICO, e a cláusula WHERE filtra as linhas em que a coluna da tabela da direita é nula — o que devolve exatamente os projetos de pesquisa que não possuem nenhuma tupla correspondente na tabela de desenvolvimento tecnológico. Essa é a técnica clássica para encontrar registros "órfãos" em SQL.
O LEFT JOIN (junção externa esquerda) é uma das junções mais cobradas em provas de banco de dados, justamente porque inverte a lógica da junção interna: em vez de descartar as linhas sem par, ela preserva todas as linhas da tabela à esquerda e preenche com NULL os campos da tabela à direita quando não há correspondência. No comando, a tabela PROJETO_PESQUISA está à esquerda do JOIN, então todas as suas tuplas aparecem no resultado — as que têm correspondência vêm com os dados de DESENVOLVIMENTO_TECNOLOGICO, e as que não têm vêm com valores nulos nas colunas dessa tabela.
O pulo do gato está na cláusula WHERE. Depois que o LEFT JOIN monta o resultado com os nulos, o filtro WHERE DESENVOLVIMENTO_TECNOLOGICO.codigo IS NULL (ou similar) elimina justamente as linhas que tiveram correspondência, sobrando apenas as tuplas de PROJETO_PESQUISA sem par na outra tabela. É o padrão "anti-join": primeiro une tudo, depois descarta o que casou. Se o filtro não existisse, o resultado seria a alternativa C (todos os projetos, relacionados ou não); com o filtro, vira a alternativa D.
Para visualizar, imagine que PROJETO_PESQUISA tem 5 projetos (P1 a P5) e DESENVOLVIMENTO_TECNOLOGICO referencia apenas P1, P2 e P3. O LEFT JOIN devolve 5 linhas: P1, P2 e P3 com dados preenchidos, e P4 e P5 com NULL na coluna da tabela da direita. O WHERE ... IS NULL corta as três primeiras e entrega exatamente P4 e P5 — os projetos sem nenhum desenvolvimento tecnológico associado.
A pegadinha que a banca explora aqui é a inversão da tabela-base: o candidato que lê o LEFT JOIN e conclui que o resultado são os projetos de DESENVOLVIMENTO_TECNOLOGICO (alternativas A e B) inverte a ordem das tabelas. A tabela que aparece primeiro no FROM é a que tem todas as suas linhas preservadas — é dela que saem os registros do resultado final. Guarde essa fronteira: tabela-base = tabela da esquerda = tabela que não perde linhas; é exatamente nela que as alternativas se dividem.
1LEFT JOIN preserva esquerda
2Sem par → NULL à direita
3WHERE ... IS NULL filtra
4Sobram órfãos da esquerda
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Inverte a tabela-base: afirma que o resultado são projetos de DESENVOLVIMENTO_TECNOLOGICO sem relação com PROJETO_PESQUISA. No LEFT JOIN, a tabela que tem todas as linhas preservadas é a da esquerda (PROJETO_PESQUISA), não a da direita. Além disso, o filtro IS NULL seleciona justamente as linhas sem correspondência — o oposto do que a alternativa descreve.
Alternativa B — ❌ Incorreta
Também inverte a tabela-base, mas o erro principal é ignorar o filtro WHERE ... IS NULL. Se a consulta fosse apenas LEFT JOIN sem filtro, o resultado incluiria todos os projetos de DESENVOLVIMENTO_TECNOLOGICO (relacionados ou não) — mas o WHERE elimina exatamente as linhas que tiveram correspondência, deixando só as que não se relacionam. A alternativa descreve o comportamento do LEFT JOIN puro, não da consulta completa.
Alternativa C — ❌ Incorreta
Descreve o resultado do LEFT JOINsem o filtro WHERE ... IS NULL: todos os projetos de pesquisa, estejam ou não relacionados. A consulta, porém, aplica o filtro que remove as linhas com correspondência, então o resultado final é apenas o subconjunto sem relação. A alternativa confunde a junção com o resultado filtrado.
Alternativa D — ✅ Correta ⟵ GABARITO
É exatamente o que a consulta faz: o LEFT JOIN preserva todos os projetos de pesquisa, e o WHERE ... IS NULL na coluna de DESENVOLVIMENTO_TECNOLOGICO seleciona apenas as tuplas sem correspondência. O resultado são os projetos de pesquisa que não estão relacionados a nenhuma tupla da tabela de desenvolvimento tecnológico — o padrão anti-join.
Alternativa E — ❌ Incorreta
Descreve o oposto do filtro: projetos que possuem ocorrências na tabela de desenvolvimento tecnológico. Isso seria obtido com um INNER JOIN ou com WHERE ... IS NOT NULL, não com IS NULL. A alternativa troca a negação do filtro, invertendo completamente o resultado.
NÃO CAIA NESSA!
A banca adora inverter a tabela-base do LEFT JOIN e o sentido do filtro IS NULL. Aqui, três alternativas (A, B e E) exploram exatamente essas duas inversões: A e B trocam a tabela da esquerda pela da direita, e E troca IS NULL por IS NOT NULL. Na prova, sublinhe qual tabela vem primeiro no FROM e qual coluna está no filtro — são os dois elementos que decidem tudo. Com treino, você enxerga essas trocas de longe 💪
PEGA ESSA DICA!
Para identificar o padrão anti-join, procure a combinação LEFT JOIN + WHERE tabela_direita.coluna IS NULL. Esse par é a assinatura de "registros sem correspondência". Se o filtro for IS NOT NULL, o resultado vira o oposto (só os que têm par). Memorize o par: LEFT JOIN + IS NULL = órfãos da esquerda.