Размещение значений NULL при сортировке столбцов

Оригинал

Если столбцы могут хранить NULL, то при сортировке используется определенный порядок размещения таких значений. В этом вопросе подход вендоров баз данных может как совпадать так и отличаться, в зависимости от цели приложения.

Использование

MySQL

PostgreSQL

Подробное объяснение 

NULL в SQL указывает на некое неизвестное значение, то есть просто не известно, что в столбце. Эти отсутствующие значения являются проблемой при сравнении их с другим значением и при сортировке строк в таблице. С математической точки зрения несуществующее значение нельзя сравнивать с чем-либо, например с каким-нибудь числом. Поэтому математически верная сортировка невозможна. Так как стандарт SQL не содержит указания как значения NULL должны обрабатываться при сортировке,  то каждая база данных была вынуждена изобретать свое собственное соглашение. В MySQL любое значение NULL будет помещено перед всеми другими значениями при выполнении сортировки по возрастанию, но в тоже время в PostgreSQL эти же значения будут размещены в конце. Оба подхода являются разными решениями для установления детерминированной сортировки, которую база данных может использовать.

Тем не менее, эти специфичные для конкретных баз данных порядки сортировки могут не соответствовать требованиям приложения. Для удобства использования можно размещать пустые значения в начале или в конце. Пользователь, сортирующий список имен по возрастанию или по убыванию, не захочет видеть пустые значения первыми когда ищет конкретную запись. Но в тоже время к отображению списка статей блога в админке будут предъявляться другие требования. Неопубликованные статьи должны быть выведены перед всеми опубликованными при сортировке по убыванию, чтобы увидеть их первыми.

Размещение значений NULL должно меняться в зависимости от контекста приложения, потому что сортировка по умолчанию базы данных не всегда будет полезна. Простое правило для проверки места расположения NULL:

  • размещайте NULL в конце когда пользователь может искать конкретные записи.
  • размещайте NULL в начале когда эти записи имеют конкретный смысл и поэтому должны предшествовать всем остальным.

Дополнительные ресурсы