Questão nº 34
Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 34)
Considere que em um banco de dados de um banco comercial há duas tabelas:
```
PESSOA_FISICA (CPF, nome, email, telefone)
CLIENTE (CPF, nome, email, telefone).
```
Um funcionário de TI recebeu a tarefa de identificar corretamente quais pessoas físicas, cadastradas na tabela
`PESSOA_FISICA`, ainda não eram clientes, pois não estavam cadastradas na tabela `CLIENTE`. Para isso, ele utilizou um
comando `SELECT` em SQL.
Que trecho, em SQL, faz parte de uma das possíveis soluções para essa tarefa?
- A`… WHERE PESSOA_FISICA.CPF NOT IN (SELECT CPF FROM CLIENTE…` (alternativa correta)
- B`… HAVING PESSOA_FISICA.CPF != CLIENTE.CPF…`
- C`… WHERE PESSOA_FISICA.CPF <> CLIENTE.CPF...`
- D`… DISTINCT PESSOA_FISICA.CPF FROM CLIENTE WHERE ...`
- E`… IN PESSOA_FISICA BUT NOT IN CLIENTE...`
Resposta comentada
Gabarito Alternativa A
Conceito-chave: Para saber o que está em uma tabela mas não em outra, usamos uma subconsulta (um SELECT dentro de outro) combinada com o operador NOT IN, que filtra os registros que não aparecem na lista retornada pela subconsulta. É como perguntar: "me dê os CPFs da tabela A que não estão na lista de CPFs da tabela B".
- (A) Correta:
WHERE PESSOA_FISICA.CPF NOT IN (SELECT CPF FROM CLIENTE...)— exatamente o que a tarefa pede: seleciona da tabelaPESSOA_FISICAapenas os CPFs que não estão na subconsulta que lista todos os CPFs da tabelaCLIENTE. - (B) Incorreta:
HAVINGé usado para filtrar grupos apósGROUP BY, não para comparar colunas de tabelas diferentes; além disso, a condiçãoPESSOA_FISICA.CPF != CLIENTE.CPFcompararia linha a linha sem critério de junção, gerando um produto cartesiano e resultados errados. - (C) Incorreta:
WHERE PESSOA_FISICA.CPF <> CLIENTE.CPFsem umJOINou subconsulta compara cada CPF de uma tabela com cada CPF da outra, retornando linhas incorretas (inclusive clientes que existem, pois o CPF deles é diferente de outros CPFs). - (D) Incorreta:
DISTINCT PESSOA_FISICA.CPF FROM CLIENTEé sintaxe inválida —DISTINCTnão vem antes do nome da coluna dessa forma, e a consulta está lendo da tabelaCLIENTE, não daPESSOA_FISICA, invertendo a lógica. - (E) Incorreta:
IN PESSOA_FISICA BUT NOT IN CLIENTEnão é sintaxe SQL válida; o correto seriaNOT IN (SELECT ...), e a palavraBUTnão existe em SQL.
Armadilha da banca na alternativa (C): Ela parece lógica à primeira vista ("CPF diferente"), mas esquece que, sem uma subconsulta ou JOIN, o banco compara todas as combinações entre as duas tabelas. Assim, um CPF que é cliente apareceria como "não cliente" porque ele é diferente de outros CPFs da tabela CLIENTE, gerando um resultado absurdo e cheio de duplicatas.
Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.