Найти тему
Идеальный блокчейн

SQL. Практика баз данных для хипстеров. Story #4

Я много лет страстно увлечен базами данных и программированием на языке SQL. Поверьте, это просто и увлекательно, к тому же высокооплачиваемое умение.

Отвлекитесь ненадолго и полистайте мои практические беседы без теоретической шелухи. Пусть вас не удивляет нумерация разделов - я постарался изложить материал в наиболее полезной последовательности.

Содержание беседы #4:

Тема 1. Понятия баз данных

Раздел 1.4 Типы данных. Ключи. Индексы. Null-значение. Ограничение данных

Пункт 1.4.3 Null-значение (Базовое понимание Null)

Что такое Null?

Отведите взгляд от ноутбука или смартфона, и представьте себе три закрытых коробки.

Вопрос: Что находится в каждой из коробок?

Вы открываете первую коробку – там яблоки. Записываем – «Яблоки».

Вы открываете вторую коробку – там ничего нет. Записываем – «Пусто».

Вы пытаетесь открыть третью коробку – не получается! Записываем – «Неизвестно».

На языке баз данных значения следующие:

”Яблоки”

“”

Null

Вопрос: Находятся ли в ящике яблоки?

Для первого ящика пишем «Да».

Для второго ящика пишем «Нет».

Для третьего ящика пишем «Неизвестно».

На языке баз данных логический результат следующий:

True

False

Unknown

Встреча с Null-значениями может произойти в следующих четырех ситуациях:

1. Поле таблицы может содержать Null. Это видно в свойствах таблицы.

2. При использовании Left Join или Right Join соединений.

3. В случае, если подзапрос не вернул ни одной строки.

Select *, (Select max(Table2.Column1)
From Table2
Where 1=0)
From Table1

4. Если мы сами создали Null (редкая ситуация, например, для тестирования).

Select 1, Null, …

Итак, Null - это отсутствие информации. Это не значит, что база заглючила и всё сломалось. Когда вы собираете данные о чём-либо, то делаете это частями, так что в определенное время части информации в базе у вас еще не будет, т.е. будет храниться отметка Null.

Размышления на тему Null.

Сам по себе он не появляется. Если ни одна из четырех приведенных выше ситуаций не случилась, то Null из ниоткуда сам не появится – думать о нем не стоит.

Если вы открываете «Свойства таблицы» и видите, что поле, которое будет задействовано у вас в логических условиях (обычно в разделе Where) допускает Null-значения. Тогда вы должны насторожиться - запереть дверь и обрезать Интернет-кабель. Шучу. Любые логические условия с участием этого поля таблицы должны иметь маленькую особенность.

Дело в том, что результат проверки логического условия – это не только True или False, но и Unknown. Третий результат может получиться только в случае неверного написания логического условия с участием Null. Т.е. значение поля в данной строке таблицы не заполнено, а мы пытаемся сравнить его значение с другим (с помощью =, <>, <=, >=).

Благо, анализ вашего запроса будет происходить выгодно для вас. Ведь правило у сервера такое: только если все логические условия равны True, только тогда всё условие для данной строки выполняется – строка подходит под условие, т.е. сервер берет ее и выводит пользователю на экран. Отсюда следует, что неважно, каков был результат – False или Unknown – строка не будет взята, потому что логическое условие для нее не True.

Задача: вывести людей, у которых имя неизвестно.

Имеется таблица с одной строкой:

Surname Name
Иванов Null

Следующие решения неверные, т.е. они не вернут ни одной строки:

…Where Surname = Null
…Where Surname = ‘’

Единственно правильное решение возвращает нужную нам строку:

…Where Surname Is Null

Т.е. только с помощью специального логического оператора Is мы можем правильно проверить значение на соответствие Null.

Итог. Null – это не ошибка. Это лишь ситуация, когда значение не известно. Это далеко не то же самое, что ноль или пустая строка.

Функция IsNull(Значение1, Значение2).

По-русски говоря, функция делает следующее: если Значение1 окажется равным Null, то вывести Значение2, иначе вывести Значение1. По-хипстерски: вернуть первое значение, отличное от Null.

Представим таблицу клиентов Client, где поле «Имя» может содержать Null.

Напишем запрос:

Select Surname, Name From Client

Результат:

Иванов Иван
Петров Null

Не красиво. Перепишем запрос:

Select Surname, IsNull(Name, “<Неизв.>”) From Client

Результат:

Иванов Иван
Петров <Неизв.>

Если сравнить необходимо более двух значений, то использовать следует:

Coalesce(Value1, Value2, Value3, ...)
(не смейтесь и не выгибайте от удивления бровь - такое вот дурацкое название функции, зато вы его быстро запомните)
или
IsNull( IsNull( Value1, Value2 ), Value3)
при этом сервер преобразует указанные функции и отработает по такому алгоритму:
case when Value1 Is not Null
then Value1
else case when Value2 Is not Null
then Value2
else case when Value3 Is not Null
then Value3 else Null end
end
end

Отнеситесь к четвертой беседе серьезно: неверная работа с Null частенько становится причиной некорректных данных в отчетах и промежуточных запросах. В одной из следующих бесед уже на красном уровне подачи информации мы раскроем еще больше тайн, которые скрывает неказистый Null.

Спасибо, что дочитали до конца! Любите друг друга... и базы данных)

Автор: Щукин Андрей (vk.com/faustonly), Санкт-Петербург. Дата публикации: 20.04.2018