Entendendo `NOT IN` vs. `NOT EXISTS` em SQL: Uma Análise com Valores `NULL`

Entender as nuances entre `NOT IN` e `NOT EXISTS` em consultas SQL é fundamental para garantir a precisão dos resultados.

Por
1 min. de leitura

Olá, futuros servidores públicos! Preparar-se para concursos públicos é um desafio e tanto, especialmente quando o assunto é Tecnologia da Informação. Mais uma vez vamos utilizar a dúvida de um de nossos alunos para explicar um assunto muito cobrado pelas bancas. A origem dessa dúvida é essa questão: 

Ano: 2018 Banca: IADES Órgão: SES-DF Prova: IADES – 2018 – SES-DF – Analista de Sistemas

Imagem associada para resolução da questão

Figura 1 – Tabelas

Considerando as duas tabelas apresentadas, assinale a alternativa que indica o resultado da query SQL a seguir.

SELECT * FROM runners WHERE id NOT IN (SELECT winner_id FROM races)

Alternativas

a)2 3 2

b)1 4 5

c)1 2 3 4 5

d)John Doe

e)Conjunto vazio

Essa questão tem como resposta a LETRA E, veremos o motivo na sequência. Ao trabalhar com bancos de dados SQL, a precisão na seleção de dados é crucial. Duas cláusulas frequentemente usadas para filtrar registros são `NOT IN` e `NOT EXISTS`. No entanto, o comportamento dessas cláusulas pode variar significativamente na presença de valores `NULL`. Para ilustrar essa diferença, consideremos duas tabelas: `RUNNERS` e `RACES`.

Figura 2 – Modelo

— Criação das tabelas

CREATE TABLE RUNNERS (ID INT, NAME VARCHAR(45));

CREATE TABLE RACES (ID INT, EVENT VARCHAR(45), WINNER_ID INT);

— Inserção de dados

INSERT INTO RUNNERS (ID, NAME) VALUES (1, ‘JOHN DOE’), (2, ‘JANE DOE’), (3, ‘ALICE JONES’), (4, ‘BOBBY LOUIS’), (5, ‘LISA ROMERO’);

INSERT INTO RACES (ID, EVENT, WINNER_ID) VALUES (1, ‘100 METER DASH’, 2), (2, ‘500 METER DASH’, 3), (3, ‘CROSS-COUNTRY’, 2), (4, ‘TRIATHALON’, NULL);

“`

Quando usamos `NOT IN` para selecionar corredores que nunca venceram uma corrida, como na consulta abaixo, o resultado pode ser um conjunto vazio devido à presença de `NULL` em `WINNER_ID`:

SELECT * FROM RUNNERS WHERE ID NOT IN (SELECT WINNER_ID FROM RACES);

Figura 3 – Resultado NOT IN

Isso acontece porque a comparação com `NULL` não é verdadeira nem falsa, mas desconhecida, fazendo com que `NOT IN` falhe em retornar qualquer registro.

Em contraste, `NOT EXISTS` permite uma abordagem mais precisa:

SELECT * FROM RUNNERS WHERE NOT EXISTS (SELECT WINNER_ID FROM RACES WHERE RUNNERS.ID = RACES.WINNER_ID);

Figura 4 – Resultado NOT EXISTS

Essa consulta retorna corredores sem vitórias registradas, ignorando efetivamente os valores `NULL` e fornecendo o resultado esperado: corredores com IDs 1, 4 e 5.

Este exemplo destaca a importância de escolher a cláusula correta ao trabalhar com valores `NULL` em SQL, garantindo a precisão e a integridade dos dados retornados.

Prof. Washington Almeida

Quer ficar por dentro dos concursos públicos abertos e previstos pelo Brasil?
clique nos links abaixo:

Concursos Abertos

Concursos 2024

Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
clique no link abaixo e inscreva-se gratuitamente:

Telegram

Por
1 min. de leitura