NULL в SQL: Что это такое и почему его знание необходимо каждому разработчику
NULL — это специальное значение, которое используется в SQL для обозначения отсутствия данных. Оно отличается от пустой строки или нулевого значения, так как NULL означает отсутствие какого-либо значения в ячейке таблицы.
История появления NULL в SQL довольно интересна и длинна. В начале 1970-х годов Д. Камерер (D. Chamberlin) и Р. Бойд (R. Boyce) предложили использовать реляционную модель для полной замены иерархических и сетевых моделей данных, которые были актуальны в то время. Полная замена предполагала возможность хранения значений NULL в таблицах структуры базы данных.
Первоначально, NULL был создан как интегральный элемент реляционной модели данных. Это означало, что NULL мог быть использован в качестве значения для любого типа данных (целого числа, строки и т.д.) или даже целой строки (например, таких значений как «неизвестно» или «нет данных»).
Когда была разработана SQL, NULL был реализован как специальное значение или маркер, который указывает на отсутствие значения в столбце. Таким образом, в SQL NULL означает отсутствие значения или неопределенное значение.
Однако, NULL создал некоторые проблемы при работе с данными в SQL. Например, если вы выполняете операцию на столбце, содержащем NULL значение, результат операции также будет NULL. Это означает, что использование NULL может приводить к нежелательным результатам, таким как непредсказуемое поведение.
Однако, важно понимать, что NULL не обязательно означает отсутствие информации или отсутствие значения в столбце. NULL может быть использован для разных целей, таких как указание на неопределенный результат для вычислений или как маркер для отметки отсутствия значения в таблице.
Рассмотрим несколько SQL операций с NULL:
- Как назначить значение NULL в SQL?
Значение NULL можно явно указать при создании таблицы или добавления записей в таблицу. Например, при создании таблицы можно указать, что один из столбцов не обязательно должен иметь значение, используя ключевое слово NULL. - Как проверить NULL в SQL?
Для того чтобы проверить значение NULL в SQL, используется оператор IS NULL. Этот оператор возвращает true, если значение столбца равно NULL. - NULL и требования целостности данных
NULL может нарушить требования целостности данных, которые гарантируют, что данные в таблице являются валидными и согласованными. Например, требование необходимости заполнения поля значением может быть нарушено, если значение NULL допустимо. - Ограничение NOT NULL
Ограничение NOT NULL позволяет определить, что значение в столбце не может быть NULL. Это означает, что при добавлении записи в таблицу обязательно должно быть заполнено значение для данного столбца. - ISNULL
Функция ISNULL возвращает первый аргумент, если он не равен NULL, и второй аргумент, если первый аргумент равен NULL. ISNULL наиболее часто используется для замены значений NULL на конкретные значения. - COALESCE
Функция COALESCE возвращает первый аргумент, который не равняется NULL. COALESCE может быть полезна, когда вам нужно выбрать первое значение из двух или нескольких, которые могут быть пустыми. - NULLIF
Функция NULLIF возвращает NULL, если два аргумента равны. Если аргументы не равны, она возвращает первый аргумент. Эта функция может быть полезна для условного выполнения некоторых операций в зависимости от того, равны ли значения.
Почему знание NULL важно для SQL-разработчиков?
Понимание того, что такое NULL и как он работает, важно для SQL-разработчиков, так как они должны убедиться, что данные в таблице корректны и не содержат NULL, если это не предусмотрено требованиями для соответствующего столбца таблицы. Также знание правильной работы с NULL в SQL позволяет избежать неожиданного поведения запросов и операторов, которые могут привести к ошибкам или неверным результатам. Кроме того, понимание того, как обрабатывать значения NULL, может улучшить эффективность запросов, так как правильное использование функций для работы с NULL может сократить количество кода и убрать дублирование.
NULL в базе данных может привести к ошибкам, например:
- Сравнение значений. Если в таблице присутствуют значения NULL, то при выполнении операции сравнения, например, WHERE column_name = NULL, результатом будет False. Вместо этого нужно использовать оператор IS NULL.
- Вычисления. Если при выполнении арифметических операций включены значения NULL, то результат такой операции тоже будет NULL. Например, 5 + NULL = NULL.
- Сортировка. При сортировке значений в столбце, которые содержат NULL, может произойти непредсказуемый результат в зависимости от реализации сортировки в базе.
- Внешние ключи. Если в таблице соединения используются внешние ключи, то значение NULL может привести к нарушению связной целостности.
- Агрегирующие функции. При использовании агрегирующих функций в запросах, значения NULL могут не быть учтены в результате.
- Вывод на экран. Если значение NULL выводится на экран пользователя, это может вызвать возможное недопонимание и ухудшение пользовательского опыта.
Все эти проблемы могут привести к ошибкам при обработке данных и привести к неправильным результатам. Необходимо быть осторожным при работе с NULL значениями в базе данных и учитывать их взаимодействие при проектировании и разработке баз данных.
Пример неудачного использования NULL
Допустим, у нас есть таблица, в которой хранится информация о заказах в интернет-магазине. Среди полей есть поля, отражающие дату создания заказа (orderdate) и дату его доставки (deliverydate).
Однажды в этой таблице обнаружилась ошибка: у нескольких заказов deliverydate было не заполнено, т.е. им было присвоено значение NULL. Разработчики не заметили этого и продолжили работу с данными.
Однако при анализе статистики продаж на одном из графиков заказы отображались в зависимости от даты доставки. Из-за того, что несколько заказов не имели значения в поле deliverydate, они не отображались на графике вовсе, что привело к искажению реальных данных и ошибочным выводам о продажах на определенные даты.
Эта ошибка привела к тому, что команда интернет-магазина долго работала с неточными данными, и необходимо было потратить много времени на исправление ошибки и калибровку аналитических инструментов. Все эти проблемы могли быть исправлены, если бы разработчики были внимательными и не допустили присвоения значения NULL в поле, которое требует обязательного заполнения.
В итоге, знание NULL очень важно для SQL-разработчиков, так как неправильное использование NULL может привести к ошибкам в запросах и значительно затруднить дальнейшую обработку данных. Однако, правильное использование NULL может упростить запросы и дать возможность корректно хранить и обрабатывать данные. Поэтому, при работе с базами данных, SQL-разработчикам необходимо быть внимательными и осознанными в использовании NULL.
Бонус
Три вопроса с собеседований, где вас проверяют на знание NULL в SQL:
- Как проверить, есть ли NULL значение в определенном столбце таблицы в SQL? Ответ: Необходимо использовать оператор «IS NULL» или «IS NOT NULL». Например, чтобы проверить, есть ли NULL значение в столбце «name» таблицы «users», нужно выполнить следующий запрос: SELECT FROM users WHERE name IS NULL;
- Как можно заменить NULL значения на определенное значение в SQL? Ответ: Для замены NULL значений можно использовать оператор «COALESCE». Например, чтобы заменить NULL значения в столбце «price» таблицы «products» на значение 0, нужно выполнить следующий запрос: SELECT COALESCE(price, 0) FROM products;
- Как можно проверить, что два столбца имеют одинаковые значения, включая NULL, в SQL? Ответ: Для этого нужно использовать оператор «IS NOT DISTINCT FROM». Он сравнивает значения двух столбцов, включая NULL значения. Например, чтобы проверить, что значения столбцов «name» и «address» в таблице «users» совпадают, нужно выполнить следующий запрос: SELECT FROM users WHERE name IS NOT DISTINCT FROM address;
Null, ноль и Undefined: разбираемся в сортах пустоты
Может показаться, что null — это название переменной, но на самом деле это специальное значение, которое означает, что переменная есть, но в переменной ничего нет. Кроме этого, есть ещё одно интересное состояние переменной — undefined , которое означает, что переменная не определена. Давайте разберёмся, в чём разница и для чего это всё нужно.
Минутка информатики. Если копать совсем глубоко, то в переменной не всегда лежат именно те данные, которые мы туда отправили.
Чаще всего при объявлении переменной компьютер выделяет сколько-то байтов в памяти, в которые можно записать любое помещающееся значение. Но это работает только для простых переменных — чисел и символов (которые внутри тоже числа). Если нам нужна строка, которая состоит из множества символов, или массив, то в переменной хранится не значение, а только ссылка на область памяти, в которой лежат наши данные. В этих случаях переменная — это карта, которая объяснит компьютеру, где найти всё остальное.
Зная это, будет проще разобраться, почему компьютер иногда вместо конкретного значения переменной записывает в неё null или undefined.
Что такое undefined
Когда мы только создаём переменную без явного указания типа и ничего в неё не кладём, то компьютер многого не знает:
- он не знает, что в ней может оказаться;
- не в курсе, сколько памяти надо будет выделить;
- не понимает, по каким правилам с этой переменной нужно работать дальше.
Чтобы пометить себе, что пока ничего не ясно, компьютер помечает эту переменную как undefined , что означает «неопределённость»:
В тех языках, где переменные не обязательно объявлять заранее, например в Python, интерпретатор тоже выведет подобное сообщение. Отличие будет в том, что здесь это приведёт к ошибке, так как компьютер даже не знает, что у него есть такая переменная.
Представьте, что вы занимаетесь уборкой и вам говорят: «Возьми мешок». Что это значит? Пока неясно: это мешок для мусора или вещей; какого объёма; полный или пустой. Просто «мешок». Если представить, что мешок — это переменная, то undefined мешок — это как раз «просто некий мешок, без уточнения».
Чаще всего в языках с сильной динамической типизацией у переменной не может быть значения undefined , потому что переменная в них появляется в момент её объявления и присваивания сразу какого-то значения. Но само понятие undefined тоже там используется — оно означает, что компьютер вообще ничего не знает про эту переменную.
Зачем нужен undefined
Чаще всего это используется для проверки состояния переменной — есть ли в ней хоть что-то. Например, если в ней что-то есть, то с этим можно работать дальше, а если нет — вывести сообщение о том, что переменная пустая. Это полезно для отладки кода или для проверки входящих в нашу программу данных и вывода информативных ошибок.
Что такое null
В отличие от undefined, когда компьютер не знает, что лежит в переменной, null — это как раз одно из значений переменной. Оно означает, что переменная — пустая, при этом компьютер точно знает, как с ней можно работать.
Допустим, мы хотим обратиться к элементу на странице по его id. Для этого мы сначала заводим переменную element, и на старте она будет определяться как undefined. После этого мы присваиваем этой переменной ссылку на нужный элемент, но если этого элемента на странице нет, то произойдёт такое:
- Скрипт попытается найти элемент на странице.
- После того как он убедится, что элемента нет, он вернёт null — это значит, что на странице ничего такого нет.
- Это значение null отправится в переменную element, и у неё появится определённое значение null.
Если вспомнить наш мешок во время уборки:
— undefined — это когда вы ничего не знаете про мешок — даже то, есть ли этот мешок в принципе или его нужно пойти и где-то купить;
— null — это когда вы знаете, что мешок есть, он определённого размера и формы, но он точно пустой и даже ещё не раскрытый;
В некоторых языках, например Python, вместо null используют None — это тоже значение переменной, которое означает, что в переменной ничего нет, но сама переменная определена верно.
Undefined и null — это одно и то же?
Нет, и в этом легко убедиться, используя строгое сравнение. Дело в том, что при обычном сравнении компьютер смотрит, есть что-то в переменной или нет, при этом ему неважно, работали мы с ней раньше или нет. А при строгом сравнении компьютер смотрит ещё и на тип данных — в этом случае сразу видно, что у undefined никакого типа данных нет:
А что такое ноль?
А ноль — это самая «жирная» пустота из всех вышеперечисленных. Ноль — это полноценное значение численной переменной (например, integer, то есть целого числа).
Представьте, что вы пишете программу, которая обрабатывает прогнозы погоды. Эти данные она получает с погодного сервера. И с этого сервера прилетала переменная temperature. Сравните:
Если temperature === undefined, то, похоже, с сервера не прилетело никакой переменной с температурой. Программа завела переменную для приёма данных, но дальше ничего не произошло. Мы даже не знаем, какого типа данные нам прилетят. А то и вовсе нет никакой переменной.
Если temperature === null, то мы знаем, в каком формате прилетит температура, но сами данные ещё не прилетели.
Если temperature === 0, то температура — ноль градусов (предположим, по Цельсию). Ноль градусов — это вполне себе значение, с которым можно работать — например нарисовать снежинку.
Возвращаясь к метафоре с мешком: ноль — это когда нам объяснили, какой именно нужен мешок, мы его взяли и запихнули в него ноль, который занял всё место. Зачем? Видимо, так надо.
Чем отличается null от 0
Здраствуйте.
Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
Re: чем 0 отличается от NULL?
От: | Аноним |
Дата: | 25.06.07 08:31 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
А посмотреть определение слабо?
Re: чем 0 отличается от NULL?
От: | Cruser |
Дата: | 25.06.07 08:44 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
#if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif
Re: чем 0 отличается от NULL?
От: | NikeByNike |
Дата: | 25.06.07 08:49 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
NULL как макрос остался для совместимости с С. В С++ смысла уже не имеет.
Нужно разобрать угил.
Re: чем 0 отличается от NULL?
От: | DuaMaHT |
Дата: | 25.06.07 08:51 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
«0» — это значение, константа. A null указывает на «пустое место» — объявленную, но неинициализированную переменную, объект и т.п.
Re: чем 0 отличается от NULL?
От: | Андрей Коростелев | http://www.korostelev.net/ |
Дата: | 25.06.07 09:03 | |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте.
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
Автор: Андрей Тарасевич
Дата: 10.12.03
Re: чем 0 отличается от NULL?
От: | Roman Odaisky | |
Дата: | 25.06.07 11:16 | |
Оценка: | 2 (2) |
Здравствуйте, Аноним, Вы писали:
А>Есть ли вообще разница? как я понимаю NULL это константа и во время компиляции она станет непосрдсвенным операндом, так же как и 0?
В двух словах: в C++ #define NULL 0.
В следующем стандарте будет nullptr — то же самое, но строже. Например, тип NULL, как ни крути, int, хотя int-то здесь и ни при чем. nullptr будет приводиться к любым указателям, но не к целочисленным типам, как сейчас. В принципе, nullptr можно сделать и сейчас:
class NullptrType < public: template class X> operator X* () const < return 0; > template class R, class C> operator R C::* () const < return 0; > private: void operator &() const; >; static NullptrType const nullptr; char* s = NULL; // OK int i = NULL; // OK! char* s = nullptr; // OK int i = nullptr; // error void f(int); void f(void *); f(NULL); // 1 f(nullptr); // 2 X* xs[10]; std::fill(xs, xs + 10, NULL); // error std::fill(xs, xs + 10, nullptr); // OK
До последнего не верил в пирамиду Лебедева.
Re[2]: чем 0 отличается от NULL?
От: | NikeByNike |
Дата: | 25.06.07 11:25 |
Оценка: |
Здравствуйте, DuaMaHT, Вы писали:
DMH>»0″ — это значение, константа. A null указывает на «пустое место» — объявленную, но неинициализированную переменную, объект и т.п.
0 и NULL — одно и тоже.
Нужно разобрать угил.
Re[2]: чем 0 отличается от NULL?
От: | jazzer | Skype: enerjazzer |
Дата: | 25.06.07 11:37 | |
Оценка: | 1 (1) |
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Аноним, Вы писали:
RO>В двух словах: в C++ #define NULL 0.
либо 0L, либо 0UL, либо еще чего-нть.
RO>В следующем стандарте будет nullptr — то же самое, но строже.
В текущей версии предлоежния — нет (хотя в первой версии предложения было действительно то же самое):
We do not propose to define the standard library macro NULL to nullptr. We considered that and liked the idea, but the EWG opinion was that it would break too much code, even though in many cases that would be code that deserved to be broken. New code should use the cleaner and safer nullptr.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2214.pdf
RO>Например, тип NULL, как ни крути, int, хотя int-то здесь и ни при чем.
или long. или любой другой тип, который захотелось данной реализации.
Короче, нулевой целочисленный литерал любого целочисленного типа:
The macro NULL is an implementation-defined C++ null pointer constant in this International Standard
(4.10).
A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to
zero.
RO>В принципе, nullptr можно сделать и сейчас:
(S. Meyers. More Effective C++, Item 25)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09
You will always get what you always got If you always do what you always did
Re[2]: чем 0 отличается от NULL?
От: | Аноним |
Дата: | 25.06.07 13:50 |
Оценка: |
Здравствуйте, Аноним, Вы писали:
а для чего тогда форум? чтоб всех в ман тыкать? если уж тыкаете, то хоть бы указали в каком именно файле это определение можно посмотреть (берёшься за дело, сделай его нормально).
Re[3]: чем 0 отличается от NULL?
От: | Roman Odaisky |
Дата: | 25.06.07 22:11 |
Оценка: |
Здравствуйте, jazzer, Вы писали:
J>(S. Meyers. More Effective C++, Item 25) 😉
Я видел несколько реализаций nullptr в рамках C++03. Ни одна не понравилась, как-то они тяп-ляп сделаны.
До последнего не верил в пирамиду Лебедева.
Re[3]: чем 0 отличается от NULL?
От: | jazzer | Skype: enerjazzer |
Дата: | 26.06.07 00:42 | |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>а для чего тогда форум? чтоб всех в ман тыкать? если уж тыкаете, то хоть бы указали в каком именно файле это определение можно посмотреть (берёшься за дело, сделай его нормально).
Если возник вопрос «Что такое Х в С++» — искать ответ надо в Стандарте С++ (актуальная ревизия — 2003 год).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09
You will always get what you always got If you always do what you always did
Re[4]: чем 0 отличается от NULL?
От: | jazzer | Skype: enerjazzer |
Дата: | 26.06.07 00:52 | |
Оценка: |
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, jazzer, Вы писали:
J>>(S. Meyers. More Effective C++, Item 25)
RO>Я видел несколько реализаций nullptr в рамках C++03. Ни одна не понравилась, как-то они тяп-ляп сделаны.
Я вот чего не понял. Они говорят, что nullptr будет считаться соответствием как для T*, так и для T::*. Но все объяснения о том, как это работает, относятся к одновременному существованию шаблонов для T* и для T::* и к тому, что в этом случае будет неоднозначность. Поэтому для меня совершенно непонятным остался вопрос — если у нас есть только шаблон для T*, то как выведется T?
В смысле,
template class T> void f(T*); f(nullptr);
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09
You will always get what you always got If you always do what you always did
Re[5]: чем 0 отличается от NULL?
От: | Roman Odaisky |
Дата: | 26.06.07 06:59 |
Оценка: |
Здравствуйте, jazzer, Вы писали:
J>Я вот чего не понял. Они говорят, что nullptr будет считаться соответствием как для T*, так и для T::*. Но все объяснения о том, как это работает, относятся к одновременному существованию шаблонов для T* и для T::* и к тому, что в этом случае будет неоднозначность. Поэтому для меня совершенно непонятным остался вопрос — если у нас есть только шаблон для T*, то как выведется T?
J>В смысле,
J>
J>template class T> void f(T*); J>f(nullptr); J>
Никак. А что здесь можно было бы ожидать? NULL бы тоже не помог. Надо что-то вроде f(nullptr).
До последнего не верил в пирамиду Лебедева.
Re[6]: чем 0 отличается от NULL?
От: | jazzer | Skype: enerjazzer |
Дата: | 26.06.07 08:16 | |
Оценка: |
Здравствуйте, Roman Odaisky, Вы писали:
RO>Никак. А что здесь можно было бы ожидать? NULL бы тоже не помог. Надо что-то вроде f(nullptr).
так а тогда непонятно, к чему вообще эти слова о том, что nullptr будет соответствовать этим шаблонам. Если ты явно инстанцируешь шаблон, то эти слова не нужны — достаточно приведения типов.
Блин, надо было Саттера спросить, пока он был здесь.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09
You will always get what you always got If you always do what you always did
Значение NULL: руководство для начинающих
Если вы далеки от работы с базами данных , для вас может быть открытием, что ноль – это не значение NULL, хотя, признаем, они созвучны. Кроме того, NULL не является значением пустой строки, хотя можно найти поле, содержащее данные любого типа.
NULL можно представить как значение для представления неизвестного фрагмента данных (обратите внимание: не нулевого, хотя поле при этом выглядит пустым). А еще он не равен ничему, даже другому NULL. И сегодня мы поговорим об этом загадочном (на первый взгляд) значении NULL более подробно.
Пример значения NULL
Итак, что вы должны знать о значении NULL? Давайте разбираться.
Представьте себе письменный стол, на котором лежат канцелярские принадлежности: 6 шариковых ручек и 2 простых карандаша. Также известно, что в ящике стола должны быть фломастеры. Но вот сколько их и есть ли они вообще — данных нет. Если нам нужно составить таблицу инвентаризации с вводом значения NULL, то выглядеть она будет так:
InventoryID | Item | Количество |
1 | ручки | 6 |
2 | карандаши | 2 |
3 | фломастеры | NULL |
Как вы понимаете, принимать за «0» количество фломастеров в данном случае было бы неверным, так как подобная запись показывала бы, что фломастеров нет вообще. Но точные данные об их количестве отсутствуют, поэтому может оказаться, что несколько штук все же есть.
Значение NULL и НЕ NULL
IS NULL и IS NOT NULL – специально созданные операторы, которые осуществляют сравнение имеющихся NULLов. IS NULL возвращает истину, если операнда является NULLом. Соответственно, если операнд не является NULLом, то значение будет ложным.
select case when null is null then ‘YES’ else ‘NO’ end from dual; — YES
select case when ‘a’ is null then ‘YES’ else ‘NO’ end from dual; — NO
IS NOT NULL имеет обратный принцип: значение будет истинным, если операнд не является NULLом, и ложным, если он таковым является.
select case when ‘a’ is NOT null then ‘YES’ else ‘NO’ end from dual; — YES
select case when null is NOT null then ‘YES’ else ‘NO’ end from dual; — NO
Учтите, что когда речь идет об отсутствующих значениях, есть особые случаи их сравнения:
- DECODE — принимает два NULLа за равные значения;
- составные индексы — в случае, когда у двух ключей есть пустые поля, но заполненные поля при этом равны между собой, то Oracle воспримет эти ключи, как равные.
Вот так проявляет себя DECODE:
select decode( null
, null, ‘EMPTY’ — это условие будет истинным
Значение NULL в MySQL
Результат при сравнении NULLов, в зависимости от операции SQL, часто будет иметь значение NULL. Предположим, что А НЕДЕЙСТВИТЕЛЕН:
Арифметические операторы
- A + B = NULL
- A – B = NULL
- A * B = NULL
- A/B = NULL
Узнай, какие ИТ — профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Павел Симонов
Исполнительный директор Geekbrains
Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.
Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!
Скачивайте и используйте уже сегодня:
Павел Симонов
Исполнительный директор Geekbrains
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
Получить подборку бесплатно
Уже скачали 24260
Операторы сравнения
- A = B = NULL
- A! = B = NULL
- A> B = NULL
- A!
Эти случаи — лишь часть примеров операторов, возвращающих значение NULL при равенстве NULL одного из операндов. На практике встречаются куда более сложные запросы, чья обработка затруднена количеством значений NULL. Главное, нужно понимать и планировать итоги работы с базой данных, в которой вы разрешаете значение NULL.
Логические операции и NULL
Для логических операторов AND и OR есть свои особенности при работе со значением NULL. Краткое руководство рассмотрим на примере.
Как правило, НЕИЗВЕСТНО обрабатывается так же, как и состояние ЛОЖЬ. Если выбрать из таблицы строки и вычисление условия X=NULL в предложении WHERE дало результат НЕИЗВЕСТНО, то ни одной строки не будет получено. Но есть и различия: выражение НЕ(ЛОЖЬ) вернет истину, а НЕ(ИЗВЕСТНО) вернет НЕИЗВЕСТНО.
Чаще всего с неизвестным результатом работают как с ЛОЖЬЮ:
select 1 from dual where dummy = null; — запрос не вернёт записей
При отрицании неизвестности результатом будет НЕИЗВЕСТНО:
exec test_bool( not(null = null)); — UNKNOWN
exec test_bool( not(null != null) ); — UNKNOWN
exec test_bool( not(null = ‘a’) ); — UNKNOWN
exec test_bool( not(null != ‘a’) ); — UNKNOWN
exec test_bool(null or true); — TRUE
exec test_bool(null or false); — UNKNOWN
exec test_bool(null or null); — UNKNOWN
exec test_bool(null and true); — UNKNOWN
exec test_bool(null and false); — FALSE
exec test_bool(null and null); — UNKNOWN
Функция NULL в MySQL
В системе MySQL есть ряд функций, позволяющих результативно работать с NULL. Это IFNULL, NULLIF и COALESCE.
- IFNULL может принять два параметра: возвращает первый аргумент, если он не является NULL, в обратном случае — возвращает второй аргумент.
- NULLIF также может принять два аргумента: если они равны, то функция возвращает NULL, в обратном случае — возвращает первый аргумент. Эта функция также будет эффективна, если в вашей таблице в столбце есть пустые строки со значением NULL.
- COALESCE может принимать список аргументов и возвращать первый аргумент не-NULL. Например, эту функцию можно применять для базы контактных данных с потенциальной возможностью в зависимости от важности информации в порядке Телефон — Электронная почта — N/A.
Для вас подарок! В свободном доступе до 03.12 —>
Скачайте ТОП-10
бесплатных нейросетей
для программирования
Помогут писать код быстрее на 25%
Чтобы получить подарок, заполните информацию в открывшемся окне
Операторы IN и NOT IN для значения NULL
Чтобы понять взаимодействие этих операторов с NULLом, рассмотрим пример.
Создадим таблицу Т, состоящую из одного числового столбца А и строками: 1, 2, 3 и NULL.
create table t as select column_value a from table(sys.odcinumberlist(1,2,3,null));
Затем выполним трассировку запроса (учтите, что для этого нужно обладать ролью PLUSTRACE).
От трассировки в листингах оставлена часть filter, чтобы показать преобразование указанных в запросе условий.
set autotrace on
Теперь, после подготовительных действий, попробуем выбрать те записи, которые будут соответствовать набору (1, 2, NULL).
select * from t where a in(1,2,null); — вернёт [1,2]
— filter(«A»=1 OR «A»=2 OR «A»=TO_NUMBER(NULL))
Дарим скидку от 60%
на обучение «Аналитик больших данных» до 03 декабря
Уже через 9 месяцев сможете устроиться на работу с доходом от 150 000 рублей
По какой-то причине строка с NULLом не выбрана. Возможно, это случилось потому, что вычисление предиката «А»=TO_NUMBER(NULL) вернуло состояние НЕИЗВЕСТНО. Попробуем явно указать условие включения NULLов в результаты запросов:
select * from t where a in(1,2) or a is null; — вернёт [1,2,NULL]
— filter(«A» IS NULL OR «A»=1 OR «A»=2)
Попробуем с NOT IN:
select * from t where a not in(1,2,null); — no rows selected
— filter(«A»<>1 AND «A»<>2 AND «A»<>TO_NUMBER(NULL))
Ни одной записи так и не появилось.
Это объясняется тем, что трехзначная логика NOT IN не взаимодействует с NULLами: при попадании NULL в условия отбора данных можно не ждать.
Значение NULL и пустая строка в СУБД
Oracle отличается от стандартов ANSI SQL в определении NULLов: он проводит знак равенства между NULL и пустой строкой. Эта особенность программы рождает много споров, хотя Oracle и заявляет, что, возможно, в будущих релизах будет изменен подход в обработке пустой строки, как NULL. Но в реальности проведение таких изменений сомнительно, так как под эту СУБД написано неимоверное количество кода.
Только до 4.12
Скачай подборку материалов, чтобы гарантированно найти работу в IT за 14 дней
Список документов:
ТОП-100 площадок для поиска работы от GeekBrains
20 профессий 2023 года, с доходом от 150 000 рублей
Чек-лист «Как успешно пройти собеседование»
Чтобы зарегистрироваться на бесплатный интенсив и получить в подарок подборку файлов от GeekBrains, заполните информацию в открывшемся окне
exec test_bool( » is null ); — TRUE
Если попытаться найти причину, почему вообще пустую строку стали считать эквивалентной NULL, то ответ можно найти в формате хранения varchar`ов и NULLов внутри блоков данных. Табличные строки Oracle хранит в структуре, представляющей собой заголовок и следующими за ним столбцы с данными.
Каждый столбец, в свою очередь, состоит из 2-х полей: длина данных в столбце (1 или 3 байта) и сами данные. При нулевой длине varchar2 в поле с данными нечего вносить, так как оно не занимает ни байта. В поле же, где указывается длина, вносится специальное значение 0xFF, что и означает отсутствие данных.
NULL Oracle представляет аналогично, то есть отсутствует поле с данными, а в поле длины данных вносится 0xFF. Так как изначально разработчики Oracle не разделяли эти два состояния, то и сейчас принцип внесения данных не изменился.
Понятие «пустая строка» допустимо толковать как абсолютное отсутствие значения, так как ее длина равна нулю. NULL же, в свою очередь, имеет длину неопределенного значения. Поэтому выражение length (») возвращает NULL, а не ожидаемый ноль.
Еще одна причина, по которой нельзя сравнивать NULL с пустой строкой: выражение val = » вернёт состояние НЕИЗВЕСТНО, так как, по сути, идентично val=NULL.
Неопределенная длина пустой строки:
select length(») from dual; — NULL
Сравнение с пустой строкой невозможно:
exec test_bool( ‘a’ != » ); — UNKNOWN
Откройте для себя захватывающий мир IT! Обучайтесь со скидкой до 61% и получайте современную профессию с гарантией трудоустройства. Первый месяц – бесплатно. Выбирайте программу прямо сейчас и станьте востребованным специалистом.
Критика такого подхода Oracle к значениям NULL и пустой строки, основывается на том, что не всегда пустая строка может означать неизвестность. Например, когда менеджер-продавец вносит данные в карточку клиента, то в поле «Контактный номер» он может указать конкретный номер; также он может указать, что номер неизвестен (NULL); но еще он может указать, что номера как такового нет (пустая строка).
С методом хранения пустых строк, предлагаемым Oracle, последний случай будет очень затруднительно осуществить. Если смотреть на этот довод критики через призму семантики, то звучит он очень убедительно. Но с другой стороны, каким образом менеджер сможет внести в поле «Контакты» пустую строку, и как в будущем он сможет отличить ее от «номер неизвестен» (NULL)?
Отличия между null и undefined
Можно сказать, что NULL – это такое значение, которое является определенным для отсутствующего объекта. UNDEFINED же означает именно неопределенность. Например:
var element;
// значение переменной element до её инициализации не определённо: undefined
element = document.getElementById(‘not-exists’);
// здесь при попытке получения несуществующего элемента, метод getElementById возвращает null
// переменная element теперь инициализирована значением null, её значение определено
Осуществляя проверку на NULL или UNDEFINED, нужно помнить о разнице в операторах равенства (==) и идентичности (===): с первым оператором производится преобразование типов.
typeof null // object (не «null» из соображений обратной совместимости)
typeof undefined // undefined
null === undefined // false
null == undefined // true
Это все то, что вы должны знать о значении NULL. Обрастая опытом и применяя некоторые уловки для избежания NullPointerException, вы научитесь делать безопасный код. Главным образом неразбериха возникает из-за того, что NULL может трактоваться как пустое значение или как неидентифицированное.