Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023
- Código
- qa538179
- Banca
- FUNDATEC
- Órgão
- CAU RS
- Ano
- 2023
- Cargo
- Ana Sup ( )
- A<>
- BIS NOT NULL
- CNOT EXISTS
- D<NULLABLE>
- E!=
GabaritoB — IS NOT NULL
Gabarito: letra B. O operador IS NOT NULL é o único, entre os listados, capaz de verificar corretamente se um campo é diferente de nulo, pois a comparação com NULL não pode ser feita com operadores de igualdade/desigualdade comuns (=, <>, !=), que retornam UNKNOWN (desconhecido) em vez de verdadeiro ou falso. Essa é a regra fundamental da lógica de três valores do SQL, e é exatamente o que a questão testa.
Na linguagem SQL, NULL não representa um valor, mas a ausência de valor — um campo desconhecido ou inexistente. Por isso, qualquer comparação direta com NULL usando operadores relacionais comuns (=, <>, !=, <, >) resulta em UNKNOWN, um terceiro estado lógico que não é nem verdadeiro nem falso. Como a cláusula WHERE só retorna as linhas para as quais a condição é verdadeira, uma comparação que resulta em UNKNOWN simplesmente não seleciona nenhuma linha — mesmo que o campo tenha um valor não nulo.
Para lidar com essa peculiaridade, o SQL fornece os operadores específicos IS NULL e IS NOT NULL. O primeiro testa se o valor é nulo; o segundo, se o valor não é nulo. Eles são os únicos meios corretos de fazer essa verificação, pois operam diretamente sobre o estado de nulidade, e não sobre o valor em si.
Um exemplo prático: considere uma tabela Cliente com o campo Telefone. Para retornar apenas os clientes que possuem telefone cadastrado, a consulta correta é SELECT * FROM Cliente WHERE Telefone IS NOT NULL. Se tentássemos SELECT * FROM Cliente WHERE Telefone <> NULL, o resultado seria vazio, pois a comparação Telefone <> NULL sempre retorna UNKNOWN, independentemente de o telefone existir ou não.
A pegadinha clássica da banca é justamente oferecer os operadores de desigualdade (<> e !=) como se fossem equivalentes a IS NOT NULL. O candidato que não domina a lógica de três valores do SQL tende a escolher essas opções, caindo na armadilha. Lembre-se: nunca compare NULL com operadores relacionais comuns — use sempre IS NULL ou IS NOT NULL.
O operador <> (diferente) é um operador relacional comum. Quando usado para comparar um campo com NULL, o resultado é UNKNOWN, não verdadeiro. Portanto, campo <> NULL nunca retorna linhas, mesmo que o campo tenha valores não nulos. A forma correta de verificar se um campo é diferente de nulo é IS NOT NULL.
O operador IS NOT NULL é a sintaxe padrão do SQL para verificar se um campo possui um valor não nulo. Ele é o oposto direto de IS NULL e é a única forma correta de testar a não-nulidade. A consulta SELECT * FROM tabela WHERE campo IS NOT NULL retorna todas as linhas em que o campo não é nulo.
O operador NOT EXISTS é usado para verificar se uma subconsulta não retorna nenhuma linha. Ele é tipicamente utilizado em consultas correlacionadas para testar a existência de registros relacionados, não para verificar a nulidade de um campo. Por exemplo, SELECT * FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.id = A.id) retorna as linhas de A que não possuem correspondência em B. Não tem relação com a verificação de valores nulos.
<NULLABLE> não é um operador válido na linguagem SQL. Trata-se de um distrator inventado pela banca, sem qualquer significado na sintaxe padrão. Não existe tal construção para verificar nulidade ou qualquer outra condição.
O operador != é uma alternativa ao <> para representar desigualdade em alguns SGBDs (como MySQL e SQL Server). No entanto, assim como <>, ele é um operador relacional comum e, quando usado para comparar com NULL, retorna UNKNOWN, não verdadeiro. Portanto, campo != NULL também não retorna linhas, mesmo para campos não nulos. A forma correta continua sendo IS NOT NULL.
A banca explora a confusão entre operadores de desigualdade (<>, !=) e o operador específico para nulidade (IS NOT NULL). Muitos candidatos escolhem <> ou != por acharem que são equivalentes, mas a comparação com NULL sempre resulta em UNKNOWN, nunca em verdadeiro. Guarde a regra: para testar nulidade, use IS NULL/IS NOT NULL; para testar valores, use =/<>/!=.
Gabarito: letra B
Link permanente: /questoes/qa538179