NULL is not zero, not empty, not false
NULL is the database's way of saying "I don't know." It is not the number zero. It is not the empty string. It is not the boolean false. It is the absence of a value — a blank space on a form that was never filled in.
NULL is contagious
Any operation involving NULL returns NULL. 5 + NULL is NULL. 'hi' || NULL is NULL. NULL = NULL is NULL (not true!). This is why every NULL check uses IS NULL / IS NOT NULL, never = NULL.
NOT NULL by default
Mark every column NOT NULL unless you genuinely need to represent the "I don't know" state. Allowing NULL where it isn't needed shifts the burden of "what if it's null?" onto every consumer of the data — and they will forget.
The IS DISTINCT FROM operator
If you need NULL-safe equality (NULL behaves as a regular value), use IS DISTINCT FROM and IS NOT DISTINCT FROM. They treat NULL = NULL as TRUE and yield FALSE elsewhere — predictable, scriptable, no three-valued logic.