Если столбцы могут хранить NULL, то при сортировке используется определенный порядок размещения таких значений. В этом вопросе подход вендоров баз данных может как совпадать так и отличаться, в зависимости от цели приложения.
Использование
MySQL
1 2 3 4 5 6 7 8 |
– Поведение по умолчанию: NULL размещены в начале SELECT * FROM customers ORDER BY country ASC; – Null размещены в начале в соответсвии с правилом SELECT * FROM customers ORDER BY country IS NOT NULL, country ASC; – NULL размещены в конце в соответствии с правилом SELECT * FROM customers ORDER BY country IS NULL, country ASC; |
PostgreSQL
1 2 3 4 5 6 7 8 |
– Поведение по умолчанию: NULL размещены в конце SELECT * FROM customers ORDER BY country ASC; – Null размещены в начале в соответсвии с правилом SELECT * FROM customers ORDER BY country ASC NULLS FIRST; – NULL размещены в конце в соответствии с правилом SELECT * FROM customers ORDER BY country ASC NULLS LAST; |
Подробное объяснение
NULL в SQL указывает на некое неизвестное значение, то есть просто не известно, что в столбце. Эти отсутствующие значения являются проблемой при сравнении их с другим значением и при сортировке строк в таблице. С математической точки зрения несуществующее значение нельзя сравнивать с чем-либо, например с каким-нибудь числом. Поэтому математически верная сортировка невозможна. Так как стандарт SQL не содержит указания как значения NULL должны обрабатываться при сортировке, то каждая база данных была вынуждена изобретать свое собственное соглашение. В MySQL любое значение NULL будет помещено перед всеми другими значениями при выполнении сортировки по возрастанию, но в тоже время в PostgreSQL эти же значения будут размещены в конце. Оба подхода являются разными решениями для установления детерминированной сортировки, которую база данных может использовать.
Тем не менее, эти специфичные для конкретных баз данных порядки сортировки могут не соответствовать требованиям приложения. Для удобства использования можно размещать пустые значения в начале или в конце. Пользователь, сортирующий список имен по возрастанию или по убыванию, не захочет видеть пустые значения первыми когда ищет конкретную запись. Но в тоже время к отображению списка статей блога в админке будут предъявляться другие требования. Неопубликованные статьи должны быть выведены перед всеми опубликованными при сортировке по убыванию, чтобы увидеть их первыми.
Размещение значений NULL должно меняться в зависимости от контекста приложения, потому что сортировка по умолчанию базы данных не всегда будет полезна. Простое правило для проверки места расположения NULL:
- размещайте NULL в конце когда пользователь может искать конкретные записи.
- размещайте NULL в начале когда эти записи имеют конкретный смысл и поэтому должны предшествовать всем остальным.
Дополнительные ресурсы
- MySQL Documentation: How to Work with NULL Values and the ordering implications.
- PostgreSQL Documentation: How to Sort Rows (ORDER BY) and handle NULL values.
Tobias Petry