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

Оригинал

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

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

MySQL

PostgreSQL

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

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

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

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

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

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

Null safety в Dart — подробный разбор

Подробно разбираемся с Null Safety в языке Dart.

Из этого видео вы узнаете:

  • Проблема: зачем нужен null safety.
  • Что такое sound null safety?
  • Как меняется система типов в Dart c введением null safety.
  • Что добавилось в синтаксисе и какие новые ключевые слова появились в языке
  • Как выполнить миграцию вашего проекта или пакета на null safety.

Двоичный поиск

Задавлись ли вы вопросом, в очередной раз используя поиск файлов в ОС, за которой работаете, почему он выполняется так медленно? Нет, даже тааааааак медленно? Читать →

Побитовые операции

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

Где применяются?

Побитовые операции широко применяются при работе с битовыми полями (флагами) и битовыми масками. Битовые поля позволяют максимально эффективно хранить некоторые состояния, имеющие только два значения: «включен» и «выключен». Access Control List (ACL) — хороший пример битового поля, использующийся для управления доступом к объекту. Например, в Linux и Mac OS каждый файл в системе имеет свой ACL, определяющий полномочия пользователя по чтению, записи или запуску файла. Битовые поля позволяют хранить несколько значений, не расходуя лишнюю память (по одному биту на каждое значение, вместо 4-х или 8-ми). А битовые маски (и побитовые операции), в свою очередь, используются для извлечения необходимых данных из битовых полей.

Довольно трудно обойтись без побитовых операций при реализации сетевой коммуникации. Побитовые операции здесь используются для проверки чек-сумм, определения битов окончания операции, для объеденения команд и данных, сериализации и т.д. и т.п.

Не получится не использовать побитовые операции и при реализации алгоритмов компресии и шифрования. Если взглянуть на любой алгоритм сжатия (например Deflate) или шифрования (например, AES), то мы увидим, что в описании довольно часто всплывают именно биты.

Однозначно существуют области программирования, в которых без побитовых операций просто невозможно обойтись. Сюда можно отнести программирование микроконтроллеров, взаимодействие с реальными устройствами, написание драйверов для них. Также сюда относится реализация программ, эмулирующих реальные устройства, такие,как эмуляторы CD-ROM, игровых приставок или виртуальных компьютеров.

Побитовые операции являются частым гостем в случаях, когда требуется использовать разного рода оптимизации и микрооптимизации кода. Банальный пример:  2 << 4 в большинстве случаев быстрее. чем Math.Pow(2, 5).

Само собой, на этом список не заканчивается, и его можно продолжить, но целью этой статьи не является описание всех возможных сфер применения побитовых операций.

Если вам кажется, что вы не столкнетесь с побитовыми операциями в повседневной работе, т.к. ваша сфера работы не входит в вышеописанные, то у нас для вас «плохие» новости. Встретиться с битовыми операциями можно где угодно, даже там, где, казалось бы, их быть вообще не должно. Но не стоит раньше времени паниковать. Не так страшен черт, как его малюют. Побитовые операции сами по себе довольно просты. И сейчас мы с ними разберемся, а заодно и закроем небольшую брешь в образовании.

Читать →

Отличия event.target и event.currentTarget

У многих новичков as3 возникает вопрос: в чем разница между свойствами target  и currentTarget  объекта события? А разница в следующем. Читать →

Статическая инициализация в ActionScript при обращении к константе

Как вы считаете, когда вызывается статическая инициализация класса в as3? Правильно, при первом обращении к классу, его свойствам, методам и т.д. А что на счет констант? Рассмотрим пример. Читать →

Правая и средняя кнопки мыши во flash

Доброго дня! Как оказалось, несмотря на то, что у flash-разработчиков уже довольно давно появилась возможность полноценно и без костылей использовать правую и среднюю кнопки мыши, многие попросту пропустили эту новость. Читать →

Кастомный курсор мыши

Сама по себе тема создания своего курсора мыши довольно избита. Но сводится, как правило, к сокрытию «настоящего» курсора ОС и перемещению клипа в координаты мыши.
Мы побеседуем о другом. Как в AS3 заменить «реальный» курсор ОС.
Начиная с версии Flash 10.2 у класса Mouse появились новые методы registerCursor для регистрации нового курсора и unregisterCursor, как не сложно догадаться, для обратной операции. Читать →