Я бы предложил, чтобы 80% столбцов были объявлены NOT NULL
.
Но во многих случаях NULL
- это «естественная» вещь для использования -
- Время начала известно, но время окончания еще не известно .
- Необязательный атрибут
- et c.
Что касается индексации, прочитайте правила и будьте готовы их соблюдать. PRIMARY KEY
запрещает NULLs
, но UNIQUE
позволяет им. Но считаются ли они «равными» или нет.
Как уже упоминалось, IS NULL
и IS NOT NULL
работают, как ожидалось, а = NULL
- нет. Также обратите внимание, что <=>
.
LEFT JOIN
создает искусственный NULLs
(когда строка 'правой' таблицы отсутствует). Пример такого использования:
FROM a
LEFT JOIN b ON ...
WHERE b.id IS NULL
См. COALESCE()
, чтобы узнать, как превратить NULL
во что-то еще. Пример:
SELECT ...,
( SELECT name FROM foo WHERE ... ) AS foo_name,
...,
FROM ...
может доставить NULL
. Это было бы дружелюбнее:
SELECT ...,
COALESCE(( SELECT name FROM foo WHERE ... ), 'N/A') AS foo_name,
...,
FROM ...
Лично я часто избегаю NULL
в этих двух местах:
string VARCHAR(99) NOT NULL DEFAULT ('') -- empty string is usually good enough
choice ENUM('unknown', 'this', 'that') NOT NULL -- easier to display and test
Практически нет разницы в производительности (пространство или скорость) между NULL
и NOT NULL
.