Unknown is not false, and a WHERE clause keeps neither
The common read: A comparison against NULL comes back false, so a row holding a NULL fails the test and every other row behaves normally.
Name the value 7 = NULL evaluates to, then read on. Not false. The comparison chapter is flat: ordinary comparison operators yield null, signifying unknown, not true or false, when either input is null; 7 = NULL and 7 <> NULL are its own two examples. Three truth values, not two: true, false, unknown. That is three-valued logic, and this lesson is its cost. A WHERE clause keeps rows whose predicate came back true, so unknown and false are discarded together, indistinguishable from a row that was never there.
It lands hardest on the expression that looks like it finds NULLs. Write where plate = null against the permits table and the count is 0, including the permit that genuinely has no plate, whose predicate is unknown rather than true. The documentation says not to write it, "because NULL is not 'equal to' NULL". IS NULL is the predicate that answers: 1 for the same table. The figure's last two columns escape it, and are the only expressions that committed to an answer; S6 names them.
The parking-permit office runs a nightly check for permits issued without a plate on file, spelled = null, and it has reported zero every night since the day it was written. The permit sitting in the table with no plate has never appeared on it. That one surfaced as an audit finding about uninspected permits, filed against the clerk who runs the check.
