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
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:
Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
clique no link abaixo e inscreva-se gratuitamente: