-- Verificar se existem notas nulas no banco atual
SELECT COUNT(*) AS notas_nulas
FROM matricula_disciplina
WHERE nota IS NULL;| notas_nulas |
|---|
| 0 |
NULL é um valor especial em SQL que indica a ausência de informação. Um valor nulo pode significar:
NULL não é zero, não é uma string vazia '' e não é false. É um valor especial que se comporta de forma diferente em operações aritméticas e comparações.
Qualquer operação aritmética envolvendo NULL retorna NULL:
| Expressão | Resultado |
|---|---|
NULL + 60 |
NULL |
NULL * 1.10 |
NULL |
120 + NULL |
NULL |
Se a nota de um aluno em uma disciplina fosse NULL (ainda não lançada), a média calculada com essa nota também seria NULL:
Verificando notas nulas — disciplinas com nota ainda não registrada:
| notas_nulas |
|---|
| 0 |
Em álgebra booleana clássica, uma comparação retorna TRUE ou FALSE. Em SQL, comparações com NULL retornam um terceiro resultado: UNKNOWN.
NULL = NULL retorna UNKNOWN, não TRUE. Para verificar se um valor é nulo, é obrigatório usar IS NULL ou IS NOT NULL.
A lógica de três valores do SQL define como AND, OR e NOT se comportam quando um dos operandos é UNKNOWN:
AND:
| A | B | A AND B |
|---|---|---|
| TRUE | TRUE | TRUE |
| TRUE | UNKNOWN | UNKNOWN |
| TRUE | FALSE | FALSE |
| UNKNOWN | UNKNOWN | UNKNOWN |
| UNKNOWN | FALSE | FALSE |
| FALSE | qualquer | FALSE |
OR:
| A | B | A OR B |
|---|---|---|
| TRUE | qualquer | TRUE |
| UNKNOWN | TRUE | TRUE |
| UNKNOWN | UNKNOWN | UNKNOWN |
| UNKNOWN | FALSE | UNKNOWN |
| FALSE | FALSE | FALSE |
A cláusula WHERE retém apenas as linhas para as quais a condição é avaliada como TRUE. Linhas com resultado UNKNOWN são descartadas, da mesma forma que linhas com resultado FALSE.
As funções de agregação (AVG, SUM, COUNT, MIN, MAX) ignoram valores nulos em sua computação:
Para demonstrar, inserimos uma matrícula com nota ainda não lançada para o aluno Pedro (2023311001), aproveitando a turma (3110401, 2025, 2, 1) na qual ele ainda não estava matriculado:
Pedro agora tem 7 matrículas — 6 com nota lançada e 1 ainda em curso (NULL):
| id_disciplina | ano | semestre | nota |
|---|---|---|---|
| 3110201 | 2023 | 2 | 9.0 |
| 3110202 | 2023 | 2 | 7.4 |
| 3110401 | 2024 | 2 | 7.5 |
| 3110402 | 2024 | 2 | 6.6 |
| 3110401 | 2025 | 2 | NA |
| 3110601 | 2025 | 2 | 4.1 |
| 3110602 | 2025 | 2 | 8.7 |
AVG(nota) ignora a linha com NULL — o denominador é 6 (notas lançadas), não 7 (total de matrículas):
| total_matriculas | matriculas_com_nota | media_nota |
|---|---|---|
| 7 | 6 | 7.22 |
IS NOT NULL filtra apenas as matrículas com nota lançada:
| id_disciplina | ano | semestre | nota |
|---|---|---|---|
| 3110201 | 2023 | 2 | 9.0 |
| 3110202 | 2023 | 2 | 7.4 |
| 3110401 | 2024 | 2 | 7.5 |
| 3110402 | 2024 | 2 | 6.6 |
| 3110601 | 2025 | 2 | 4.1 |
| 3110602 | 2025 | 2 | 8.7 |
Para verificar a presença ou ausência de valores nulos, SQL oferece predicados especiais:
| id_disciplina | ano | semestre | turma | horario |
|---|---|---|---|---|
| 2110201 | 2023 | 2 | 1 | 2f-19:00-21:30 |
| 2110202 | 2023 | 2 | 1 | 2f-19:00-21:30 |
| 2110201 | 2024 | 2 | 1 | 3f-19:00-21:30 |
| 2110202 | 2024 | 2 | 1 | 3f-19:00-21:30 |
| 2110401 | 2024 | 2 | 1 | 2f-19:00-22:20 |
NOT NULL nas colunas que sempre devem ter um valor.IS NULL ou IS NOT NULL.= NULL; use sempre IS NULL.| id_aluno | nota | nota_mais_1 | nota_dobro |
|---|---|---|---|
| 2023311001 | NA | NA | NA |
-- Turmas de demonstração: horário ausente, sala ausente, e ambos ausentes
INSERT INTO ministra (id_disciplina, ano, semestre, turma, id_prof, horario, sala)
VALUES
(3110201, 2026, 2, 1, 31200001, NULL, 'ESETI-SALA-010'),
(3110202, 2026, 2, 1, 31400002, '5f-13:45-16:15', NULL ),
(3110401, 2026, 2, 1, 31200001, NULL, NULL )
ON CONFLICT DO NOTHING;| id_disciplina | ano | semestre | turma | horario_exibido | sala_exibida |
|---|---|---|---|---|---|
| 3110401 | 2026 | 2 | 1 | Horário não definido | Sala não definida |
| 3110201 | 2026 | 2 | 1 | Horário não definido | ESETI-SALA-010 |
| 3110202 | 2023 | 2 | 1 | 2f-13:45-16:15/4f-13:45-16:15 | ESETI-SALA-003 |
| 3110402 | 2024 | 2 | 1 | 2f-13:45-16:15/4f-13:45-16:15 | ESETI-SALA-005 |
| 3110202 | 2024 | 2 | 1 | 2f-13:45-16:15/4f-13:45-16:15 | ESETI-SALA-006 |
| resultado_incorreto |
|---|
| 0 |
| resultado_correto |
|---|
| 1 |
Armadilha clássica: WHERE coluna = NULL nunca retorna linhas — a comparação com NULL usando = sempre resulta em NULL (desconhecido), não TRUE. Use sempre IS NULL ou IS NOT NULL.