Не равно null sql: SQL условие IS NOT NULL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Содержание
IS NULL (Transact-SQL) — SQL Server
Twitter
LinkedIn
Facebook
Адрес электронной почты
-
Статья -
-
Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)
Определяет, может ли указанное выражение быть NULL.
Соглашения о синтаксисе Transact-SQL
Синтаксис
expression IS [ NOT ] NULL
Примечание
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
expression
Любое допустимое выражение expression.
NOT
Задает отрицание логического результата. Предикат меняет возвращаемые выражением значения на обратные, возвращая TRUE, если значение не равно NULL и FALSE, если значение равно NULL.
Типы результата
Boolean
Значения кода возврата
Если значение expression равно NULL, IS NULL возвращает TRUE; в противном случае возвращается значение FALSE.
Если значение expression равно NULL, IS NOT NULL возвращает FALSE; в противном случае возвращается значение TRUE.
Для определения, имеет ли выражение значение NULL, используйте IS NULL или IS NOT NULL вместо сравнения операторов (например = или !=). Сравнение операторов возвращает UNKNOWN, если хотя бы один аргумент или они оба равны NULL.
Примеры
В следующем примере возвращается наименование и вес всех продуктов, для которых вес меньше 10
фунтов, или неизвестен цвет, либо NULL
.
USE AdventureWorks2012; GO SELECT Name, Weight, Color FROM Production.Product WHERE Weight < 10.00 OR Color IS NULL ORDER BY Name; GO
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
В следующем примере возвращаются полные имена всех сотрудников с инициалами отчества.
-- Uses AdventureWorks SELECT FirstName, LastName, MiddleName FROM DIMEmployee WHERE MiddleName IS NOT NULL ORDER BY LastName DESC;
См. также:
CASE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
Инструкция CREATE TABLE (Transact-SQL)
Типы данных (Transact-SQL)
Выражения (Transact-SQL)
Инструкция INSERT (Transact-SQL)
LIKE (Transact-SQL)
Операторы (Transact-SQL)
Логические операторы (Transact-SQL)
SELECT (Transact-SQL)
sp_help (Transact-SQL)
UPDATE (Transact-SQL)
Предложение WHERE (Transact-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;
IS DISTINCT FROM — Оператор сравнения, который рассматривает два значения NULL как одно и то же
В SQL null
не равен ( =
) чему-либо — даже другому null
. Согласно трехзначной логике SQL, результатом null = null
является не true , а unknown . В SQL есть предикат is [not] null
для проверки того, является ли конкретное значение null
.
С [не] отличается от
SQL также предоставляет оператор сравнения, который обрабатывает два null
значения совпадают.
<выражение> НЕ ОТЛИЧАЕТСЯ ОТ <выражения>
Обратите внимание, что вы должны использовать инвертированную форму с , а не
, чтобы получить логику, аналогичную оператору равенства ( =
).
Следующая таблица истинности подчеркивает разницу между знаком равенства ( =
) и тем, что не отличается от
.
А | В | А = В | А НЕ ОТЛИЧАЕТСЯ ОТ В правда | |
---|---|---|---|---|
0 | 1 | ложь | ложь | |
0 | нуль | неизвестно 90 012 | ложный | |
нулевой | нулевой | неизвестно | true |
Результат при равенстве ( =
) равен unknown если один оператор равен null
. не отличается от сравнения
: true , если оба значения null
или false , если только одно null
.
Соответствующие альтернативы
Примечание
Хотя существуют стандартные альтернативы , которые не отличаются от
, часто лучше использовать собственную альтернативу.
Из-за трехзначной логики SQL полностью эквивалентная замена для A не отличается от B
, которая работает во всех базах данных SQL, удивительно сложна — даже если мы ограничиваем требование случаями, когда вычисление выражений A
и B
является детерминированным и не имеет побочных эффектов.0
СЛУЧАЙ, КОГДА (a = b) или (a IS NULL AND b IS NULL) ТОГДА 0 ИНАЧЕ 1 END = 0
Результатом выражения в предложении when
является true , если оба аргумента равны или оба равны null
. Если только один аргумент равен null
, результатом будет unknown , а не false . Часто это не проблема, потому что SQL обычно обрабатывает unknown как false при принятии бинарных решений, таких как принятие или отклонение строки для 9.0003, где пункт .
Для получения полностью эквивалентной функциональности не отличается от
, т.е. либо истина , либо ложь , но никогда неизвестно — выражение case
сводит трехзначный результат к двузначному. В некоторых базах данных не является ложным,
можно использовать вместо выражения case
. Этот метод объясняется в « Бинарные решения, основанные на трехзначных результатах ».
От своего имени
Я зарабатываю на жизнь обучением SQL, настройкой и консультированием SQL, а также своей книгой «Объяснение производительности SQL». Узнайте больше на https://winand.at/.
Другим вариантом является использование табличных операторов, которые внутренне используют отдельные сравнения. В следующем фрагменте используется пересечение с
для определения общего подмножества. Каждый из двух сравниваемых наборов содержит только одно значение (одна строка с одним столбцом). Если это дважды одно и то же значение, общее подмножество будет этим значением. В противном случае общее подмножество пусто. Эту логику можно легко проверить на примере 9.0003 где предложение с существует
предикат:1
СУЩЕСТВУЕТ (ЗНАЧЕНИЯ (A) ПЕРЕСЕЧАТЬ ЦЕННОСТИ (Б) )
Это имеет то преимущество, что не повторяет никаких выражений. К сожалению, он работает не со всеми базами данных из-за использования предложения values
. Выбор из фиктивной таблицы с одной строкой может использоваться для получения соответствующего и широко поддерживаемого решения.
Совместимость
Предикат [не]отличен от
был введен в два этапа: SQL:1999 добавлен T151, «DISTINCT predicate». Необязательное отрицание с вместо
было добавлено SQL:2003 как функция T152, «Предикат DISTINCT с отрицанием».
BigQueryDb2 (LUW)aaMariaDBMySQLOracle DBPostgreSQLSQL ServerSQLiteотличается отне отличается отиспользуя регистр и имеет значение nullиспользуя пересечение, значения, существует
- Доступно в 11.1 Mod Pack 1/Fix Pack 1
Собственные альтернативы
90 002 Большинство баз данных, которые не предлагают , не являются в отличие от
, предлагают запатентованную альтернативу, которая более удобна, чем аналогичная альтернатива, описанная выше. Следующие проприетарные функции полностью совместимы, т.е. они имеют двузначный результат и никогда не возвращают неизвестно .
BigQueryDb2 (LUW)MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLiteintersect, выберите без декодирования (A, B, 0, 1) = 0A is BA <=> B
Exists
, выберите
без из
, пересекаются
стандартное решение с использованием существует
, значения
и пересекаются
можно легко изменить для работы с большим количеством баз данных с помощью выбрать
без из
вместо значений 9Предложение 0004:
СУЩЕСТВУЕТ (ВЫБЕРИТЕ c1 ПЕРЕСЕЧАТЬ ВЫБЕРИТЕ c2 )
decode — Db2, Oracle, h3
Db2, база данных Oracle и h3 имеют проприетарную функцию decode
, которая использует , не отличается от внутренней семантики
. 2 Следующий пример имеет тот же эффект, что и A не отличается от B
:
DECODE(A, B, 0, 1) = 0
is
— SQLite, h3
Оператор is
SQLite (документация) и h3 (документация) может сравнить два выражения (а не только равно [не] null
), и имеет ту же семантику, что и , не отличающуюся от
.
<=>
— MySQL, MariaDB
MySQL предлагает собственный оператор сравнения <=>
, который работает так же, как не отличается от
.3
ANSI_NULLS
— SQL Server
Устаревший параметр ANSI_NULLS SQL Server делает некоторое сравнение равенства ( =
) действовать так, как если бы это было сравнение , не отличающееся от сравнения
.
Предупреждение
ANSI_NULLS OFF
устарел: его использование может вызвать ошибки в будущих версиях SQL Server.
Также обратите внимание, что это влияет не на все знаки равенства, а только на те, где одна сторона сравнения является переменной или литералом null
. Это не влияет на общие сравнения <выражение> = <выражение>
.
Об авторе
Маркус Винанд — представитель SQL Renaissance. Его миссия — познакомить разработчиков с эволюцией SQL в 21 веке. Маркуса можно нанять в качестве тренера, спикера и консультанта через winand.at.
SQL: условие IS NOT NULL
В этом руководстве по SQL объясняется, как использовать условие SQL IS NOT NULL с синтаксисом и примерами.
Описание
Условие IS NOT NULL используется в SQL для проверки значения, отличного от NULL. Он возвращает TRUE, если найдено значение, отличное от NULL, иначе возвращает FALSE. Его можно использовать в операторах SELECT, INSERT, UPDATE или DELETE.
Синтаксис
Синтаксис условия IS NOT NULL в SQL:
выражение НЕ НУЛЕВОЕ
Параметры или аргументы
- выражение
- Выражение для проверки значения NOT NULL.
DDL/DML для примеров
Если вы хотите следовать этому руководству, получите DDL для создания таблиц и DML для заполнения данных. Тогда попробуйте примеры в своей собственной базе данных!
Получить DDL/DML
Пример — использование IS NOT NULL с оператором SELECT
При тестировании значения, отличного от NULL, IS NOT NULL является рекомендуемым оператором сравнения для использования в SQL. Начнем с примера, показывающего, как использовать условие IS NOT NULL в операторе SELECT.
В этом примере у нас есть таблица products со следующими данными:
product_id | имя_продукта | id категории |
---|---|---|
1 | Груша | 50 |
2 | Банан | 50 |
3 | Оранжевый | 50 |
4 | Яблоко | 50 |
5 | Хлеб | 75 |
6 | Нарезанная ветчина | 25 |
7 | Клинекс | НУЛЕВОЙ |
Введите следующую инструкцию SQL:
Попробуйте
SELECT * ИЗ продуктов ГДЕ category_id НЕ NULL;
Будет выбрано 6 записей. Вот результаты, которые вы должны увидеть:
product_id | имя_продукта | id категории |
---|---|---|
1 | Груша | 50 |
2 | Банан | 50 |
3 | Оранжевый | 50 |
4 | Яблоко | 50 |
5 | Хлеб | 75 |
6 | Нарезанная ветчина | 25 |
В этом примере будут возвращены все записи из таблицы products , где customer_id не содержит значения NULL.
Пример — использование IS NOT NULL с оператором UPDATE
Далее рассмотрим пример использования условия IS NOT NULL в операторе UPDATE.
В этом примере у нас есть таблица с именем клиентов со следующими данными:
customer_id | фамилия | имя_имя | любимый_веб-сайт |
---|---|---|---|
4000 | Джексон | Джо | techonthenet. com |
5000 | Смит | Джейн | digminecraft.com |
6000 | Фергюсон | Саманта | bigactivities.com |
7000 | Рейнольдс | Аллен | checkyoumath.com |
8000 | Андерсон | Пейдж | НУЛЕВОЙ |
9000 | Джонсон | Дерек | techonthenet.com |
Введите следующий оператор UPDATE:
Попробуйте
UPDATE клиентов УСТАНОВИТЕ Favorite_website = 'techonthenet.com' ГДЕ Favorite_website НЕ НУЛЕВОЕ;
Будет обновлено 5 записей. Снова выберите данные из таблицы клиентов :
SELECT * FROM customers;
Вот результаты, которые вы должны увидеть:
customer_id | фамилия | имя_имя | любимый_веб-сайт |
---|---|---|---|
4000 | Джексон | Джо | techonthenet. com |
5000 | Смит | Джейн | techonthenet.com |
6000 | Фергюсон | Саманта | techonthenet.com |
7000 | Рейнольдс | Аллен | techonthenet.com |
8000 | Андерсон | Пейдж | НУЛЕВОЙ |
9000 | Джонсон | Дерек | techonthenet.com |
В этом примере все значения Favorite_website в таблице customers будут обновлены на «techonthenet.com», где Favorite_website содержит значение NULL. Как видите, Favorite_website был обновлен во всех строках, кроме одной.
Пример. Использование IS NOT NULL с оператором DELETE
Далее рассмотрим пример использования условия IS NULL в операторе DELETE.