Null — спеціальне значення, яке використовується в SQL для позначення відсутності даних. NULL відповідає поняттю «порожнє поле», тобто «поле, яке не містить ніякого значення». Введено винахідником реляційної моделі даних Едгаром Коддом, SQL Null слугує для виконання вимоги, що всі дійсно реляційні системи керування базами даних (РСКБД) підтримують представлення «відсутньої і непридатної інформації». Кодд також ввів використання малої літери грецької омега (ω) як символу для представлення Null в теорії баз даних. NULL
також є зарезервованим словом в SQL, яке вказує на спеціальну позначку Null.
Null був причиною суперечок і дебатів через свою асоціацію з трійковою логікою, особливих вимог з його використання в інструкції SQL JOIN, і спеціальної обробки агрегатними функціями та операторами групування SQL. Хоча особливі функції та предикати правильно обробляють Null, опоненти відчувають, що підтримка цієї можливості вводить непотрібну складність і суперечливість в реляційну модель даних.
Історія
Null був введений Едгаром Коддом як засіб для представлення відсутніх даних в реляційній моделі незалежно від типу даних. Вподальшому він опублікував свою статтю в двох частинах в часописі ComputerWorld, в цій статті він презентував 12 правил за якими можна визначити чи є СКБД дійсно реляційною. Кодд також ввів тризначну логіку, яка має три значення істинності Істина (True), Хиба (False) та Невідомо (Unknown), яка дуже близька до концепції Null. Значення Невідомо генерується коли Null порівнюється з будь-яким значенням даних або з Null.
У своїй книзі «The Relational Model for Database Management, Version 2» Кодд, зазначив, що єдиний Null прийнятий в стандарті SQL недостатній, і має бути замінений двома різними Null значеннями для позначення причини відсутності. Ці дві Null-позначки зазвичай згадується як А-значення (A-Values) та І-значення (I-Values), що представляють Відсутній та прийнятний (Missing But Applicable) та Відсутній та неприйнятний (Missing But Inapplicable) відповідно. Рекомендація Кодда вимагала розширення логічної структури SQL для відповідності чотиризначній логічній системі. Через цю додаткову складність ідея не отримала широко розповсюдження.
Тризначна логіка
Через те, що Null не є членом будь-якого домену даних, ми його не сприймаємо як значення, радше як позначку відсутності даних. Через це порівняння з Null ніколи не дасть в результаті Істина або Хиба, результат буде завжди третім логічним значенням, Невідомо. Логічний результат наступного виразу, що порівнює 10 з Null, Невідомо:
SELECT 10 = NULL -- В результаті Невідомо
Однак, певні вирази з Null можуть повертати значення якщо Null не впливає на вихідне значення виразу. Припустимо, що в наступному прикладі другий операнд обчислюється тільки якщо в цьому виникла потреба:
SELECT TRUE OR NULL -- В результаті Істина
В цьому випадку факт того, що значення праворуч від OR невідоме не впливає на кіневий результат.
SQL реалізує три логічних значення, таким чином реалізації SQL мають забезпечувати тризначну логіку. Керівні правила тризначної логіки в SQL показані в таблиці нижче (p і q представляють логічні стани)"
p | q | p OR q | p AND q | p = q |
---|---|---|---|---|
True | True | True | True | True |
True | False | True | False | False |
True | Невідомий | True | Невідомий | Невідомий |
False | True | True | False | False |
False | False | False | False | True |
False | Невідомий | Невідомий | False | Невідомий |
Невідомий | True | True | Невідомий | Невідомий |
Невідомий | False | Невідомий | False | Невідомий |
Невідомий | Невідомий | Невідомий | Невідомий | Невідомий |
p | NOT p |
---|---|
True | False |
False | True |
Невідомий | Невідомий |
Базові оператори порівняння в SQL завжди повертають Невідомо коли щось порівнюється з Null, таким чином стандарт SQL забезбечує два спеціальних порівняльних пердиката для Null. IS NULL
та IS NOT NULL
предикати перевіряють коли дані Null чи ні.
Типізація даних
Null в SQL нетипізований, тобто він не розпізнається як ціле, символ чи будь-який інший тип даних. Через це, часом дуже важливо явно приводити Null до певного типу даних. Наприклад, якщо перевантажені функції підтримуються РСКБД, SQL може бути неспроможним автоматично вибрати правильну функцію без знання типів даних всіх параметрів, включно з тими де передається Null.
Мова маніпулювання даними
Тризначна логіка SQL зустрічається в мові маніпулювання даними в предикатах порівняння в DML виразах і запитах. Пункт WHERE
вимагає від DML виразу діяти тільки для рядків на яких предикат повертає Істина. Рядки на яких предикат повертає Хиба або Невідомо не піддаються дії DML виразів INSERT
, UPDATE
чи DELETE
, а також відкидаються DML запитом SELECT
. Розуміння Невідомо і Хиба як одного і того самого результату є помилкою, яка часто зустрічається при роботі з Null. Наступний приклад показує таку помилку:
SELECT * FROM t WHERE i = NULL;
Наведений запит завжди буде повертати нуль рядків через те, що порівняння стовпця i з Null завжди дає Невідомо, навіть для рядків де i дорівнює Null, що змушує SELECT
відкинути всі рядки. (Однак, на практиці, деякий SQL інструментрарій повертає рядки при використанні порівняння з Null.)
CASE вирази
SQL вирази CASE
діють за тими ж правилами обробки Null, що і DML пункт WHERE
. Через те, що цей вираз можна трактувати як послідовність умов на рівність, простий вираз CASE
не може прямо перевірити на присутність Null. Перевірка на Null в простому виразі CASE
завжди повертає Невідомо, як в наступному прикладі:
SELECT CASE i WHEN NULL THEN 'Is Null' -- Цей варіант ніколи не спрацює WHEN 0 THEN 'Is Zero' -- Спрацює коли i = 0 WHEN 1 THEN 'Is One' -- Спрацює коли i = 1 END FROM t;
Завдяки тому, що i = NULL
обчислюється як Невідомо, неважливо що міститься в стовпці i (навіть якщо там Null), рядок 'Is Null'
ніколи не буде повернутий.
Пошуковий вираз CASE
також повертає перше значення для якого предикат порівняння повертає Істина, включно з порівняннями, що використовують IS NULL
та IS NOT NULL
. Наступний приклад показує як використовувати пошуковий вираз CASE
для правильної перевірки на Null:
SELECT CASE WHEN i IS NULL THEN 'Null Result' -- Спрацює коли i буде NULL WHEN i = 0 THEN 'Zero' -- Спрацює коли i = 0 WHEN i = 1 THEN 'One' -- Спрацює коли i = 1 END FROM t;
В пошуковому виразі CASE
, рядок 'Null Result'
буде повернуто для всіх рядків де i буде Null.
Check constraint
Первинне місце де тризначна логіка SQL перетинається з SQL мовою опису даних (DDL) це в формі . Перевірка на обмеження розміщена на ствопці діє за дещо різними правила порівняно з DML пунктом WHERE
. Якщо DML пункт WHERE
має отримати Істина для рядка, тоді як перевірка на обмеження має отримати не Хиба. Це означає, що перевірка на обмеження буде успішно пройдена якщо результат буде Істина або Невідомо. Таблиця з перевіркою на обмеження в наступному прикладі забороняє вставляння будь-яких цілих значень в стовпець i, але вона дозволяє вставляти Null завдяки тому, що результат перевірки буде Невідомо.
CREATE TABLE t ( i INTEGER, CONSTRAINT ck_i CHECK ( i < 0 AND i = 0 AND i > 0 ) );
Для заборони вставлення значень Null, можна застосувати NOT NULL
, як показано в наступному прикладі. Обмеження NOT NULL
семантично тотожно перевірці на обмеження з предикатомIS NOT NULL
.
CREATE TABLE t ( i INTEGER NOT NULL );
Процедурні розширення
SQL/PSM (SQL Persistent Stored Modules) визначає процедурні розширення для SQL, такі як вираз IF
. Однак, головні постачальники SQL продуктів мають свої історично включені процедурні розширення. Процедурні розширення для організації циклів і порівнянь діють із Null порівняннями схожим чином з DML виразами і запитами. Наступний фрагмент коду, в форматі стандарту ISO SQL, використовує Null тризначну логіку в виразі IF
.
IF i = NULL THEN SELECT 'Результат Істина' ELSEIF NOT(i = NULL) THEN SELECT 'Результат Хиба' ELSE SELECT 'Результат Невідомо';
Вираз IF
виконує дію тільки якщо порівняння обчислюється як Істина. Для виразів яки обчислюються як Хиба або Невідомо, IF
передає керування в пункт ELSEIF
і потім в пункт ELSE
. Результатом попереднього коду буде завжди повідомлення «Результат Невідомо»
завдяки тому, що порівняння з Null завжди повертає Невідомо.
Об'єднання
Зовнішнє об'єднання в SQL, включно з лівим зовнішнім об'єднанням, правим зовнішнім об'єднанням та повним зовнішнім об'єднанням, автоматично підставляє Null як заповнювач для відсутніх значень у відповідних таблицях. Наприклад, для лівих зовнішніх об'єднань Null генерується на місцях з таблиць, що знаходяться праворуч від оператора LEFT OUTER JOIN
. Наступний простий приклад використовує дві таблиці для демонстрації підстановки Null замінника при лівому зовнішньому об'єднанні.
Перша таблиця (Employee) містить ID службовців та імена, тоді як друга таблиця (PhoneNumber) містить відповідно ID службовців та телефонні номери.
|
|
Наступний SQL запит виконує ліве зовнішнє об'єднання на цих двох таблицях.
SELECT e.ID, e.LastName, e.FirstName, pn.Number FROM Employee e LEFT OUTER JOIN PhoneNumber pn ON e.ID = pn.ID;
Результатний набір цього запиту показує як SQL використовує Null як замінник для значень відсутніх в таблиці PhoneNumber.
ID | LastName | FirstName | Number |
---|---|---|---|
1 | Сквира | Степан | 555-2323 |
2 | Ворохта | Василь | NULL |
3 | Толока | Тетяна | 555-9876 |
4 | Балабух | Борислав | NULL |
Внутрішнє об'єднання, яке також присутнє в стандарті SQL, не продукує Null замість відсутніх значень в відповідних таблицях.
Треба бути обережним використовуючи стовпці з можливими значеннями Null в критеріях об'єднань SQL. Через те, що Null не дорівнює іншому Null, Null в стовпці однієї таблиці не буде об'єдуватись з Null в парній таблиці шляхом використання стандартних операторів для перевірки рівності. SQL функція COALESCE
або вирази CASE
можуть бути використані для такої перевірки в критеріях об'єднання, IS NULL
і IS NOT NULL
предикати також можуть бути використані в критеріях об'єднання.
Наступний вираз перевіряє на рівність значення A і B і трактує Null-и як рівні значення. Оператор IFNULL
необхідний з огляду на те, що A = B повертає Null якщо хоча б одне значення є Null і NULL OR FALSE
є Null.
IFNULL( A = B, FALSE ) OR ( A IS NULL AND B IS NULL )
Математичні операції та об'єднання рядків
Через те, що Null не тип даних, а просто позначка невідомого значення, використання математичних операторів з Null повертає невідоме значення, яке представляється за допомогою Null. В наступному прикладі, добуток 10 та Null повертає Null:
10 * NULL -- Результат NULL
Це може призвести до неочікуваних результатів. Наприклад, при спробі розділити Null на нуль, платформа може повернути Null замість генерування помилки ділення на нуль ("data exception - division by zero").. Хоч поведінка в цій ситуації не визначена стандартом ISO SQL багато СКБД трактують цю операцію схожим чином. Наприклад, Oracle, PostgreSQL, MySQL Server і Microsoft SQL Server повернуть Null як результат наступного виразу:
NULL / 0
Операція конкатенації рядків, яка часто зустрічається в SQL, також продукує Null коли один з операндів Null. Наступний приклад показує, як результат Null буде повернений при використанні Null у SQL-операції з'єднання стрічок з використанням оператора ||
.
'Fish ' || NULL || 'Chips' -- Результат NULL
Це не вірно для всіх реалізацій баз даних. Наприклад, в Oracle NULL та порожній рядок трактуються однаково, таким чином 'Fish ' || NULL || 'Chips' повертає 'Fish Chips'.
Агрегатні функції
SQL визначає агрегатні функції для спрощення агрегатних обчислень на сервері. Майже всі агрегатні функції виконують крок з виключення Null, таким чином Null значення не включаються в результат обчислень. Таке неявне виключання Null може відбитися на результаті обчислень агрегатної функції.
Наступна таблиця видає різні результати для кожного стовпця при застосуванні агрегатної функції AVG
:
i | j |
---|---|
150 | 150 |
200 | 200 |
350 | 350 |
NULL | 0 |
Агрегатна функція AVG
застосована до стовпця i повертає 233 і 175 коли ми застосовуємо її до стовпця j. Крок з виключення Null призводить до різниці в результаті. Єдина агрегатна функція яка не виключає Null це функція COUNT(*)
.
Групування та сортування
Через те, що SQL:2003 визначає позначки Null як нерівні одна одній, додаткове визначення було необхідне для групування Null разом при виконанні певних операцій. SQL визначає «будь-які два значення, які рівні між собою або будь-які два Null»", як «нерізні». Це визначення «нерізності» для групування та сортування позначок Nulls коли пункт GROUP BY
(або інші ключові слова, що виконують групування) використовуються.
Інші SQL оператори, вирази та ключові слова використовують «нерізні» в їхньому трактуванні позначок Null. Вірно для наступних:
PARTITION BY
разом ізROW_NUMBER
UNION
,INTERSECT
таEXCEPT
оператори, що трактують NULL як рівні для порівняння/виключеня рядківDISTINCT
в запитіSELECT
- Стовпці в яких не дозволено зберігати більше одного Null, наприклад стовпці з обмеженням на унікальність
Стандарт SQL не визначає явно порядок сортування за умовчанням для позначок Null. Замість цього, Null можуть бути відсортовані перед або після всіх даних, використовуючи NULLS FIRST
або NULLS LAST
пункт виразу ORDER BY
. Хоча й не всі постачальники СКБД підтримують цю функціональність. Постачальники, які не реалізують цю функціональність можуть визначити різні трактування для сортування позначок Null в СКБД.
Функції обробки Null
SQL визначає дві функції обробки Null: COALESCE
і NULLIF
. Обидві функції є скороченнями для пошукових виразів CASE
.
COALESCE
Функція COALESCE
приймає список параметрів і повертає перше не Null значення зі списку:
COALESCE(value1, value2, value3, ...)
COALESCE
визначена як умовне позначення для наступного SQL CASE
виразу:
CASE WHEN value1 IS NOT NULL THEN value1 WHEN value2 IS NOT NULL THEN value2 WHEN value3 IS NOT NULL THEN value3 ... END
Деякі SQL СКБД реалізують специфічні функції подібні до COALESCE
. Наприклад реалізують функцію ISNULL
або інші схожі функції, які функціонально подібні до COALESCE
.
NULLIF або NVL
Функція NULLIF
приймає два параметри. Якщо перший параметр дорівнює другому NULLIF
повертає Null. Інакше, повертається значення першого параметра.
NULLIF(value1, value2)
Тобто, NULLIF
є скороченням для наступного виразу CASE
:
CASE WHEN value1 = value2 THEN NULL ELSE value1 END
Вираз COALESCE
може бути приведений до еквівалентного виразу NVL
у такий спосіб:
COALESCE ( val1, ... , val{n} )
переходить в:
NVL( val1 , NVL( val2 , NVL( val3 , ... , NVL ( val{n-1} , val{n} ) ... )))
Суперечка
Загальні помилки
Неправильне розуміння як Null працює стає причиною великої кількості помилок в SQL коді, як в ISO SQL виразах, так і в специфічних діалектах SQL реальних систем баз даних. Ці помилки зазвичай виникають в результаті плутання між Null і або 0 (нуль), або порожнім рядком (рядком зі значенням нульової довжини, представленим в SQL як ''
). ISO SQL стандарт визначає Null як відмінний від порожнього рядка та числового значчення 0
. В той час як Null позначає відсутність значення, порожній рядок або цифра нуль представляють реальні значення.
Наприклад, пункт WHERE
або умовний вираз порівнюють значення в стовпці із константою. Часто невірно припускається, що відсутнє значення буде «менше ніж» або «не дорівнюватиме» константі, але, насправді, вираз повертає Невідомо. Як в прикладі нижче:
SELECT * FROM sometable WHERE num <> 1; -- Рядки де num є NULL не будуть повернуті, -- протилежно до очікувань багатьох користувачів.
Схожим чином, Null значення часто плутають з порожніми рядками. Припустимо існування функції LENGTH
, яка повертає кількість знаків в рядку. Коли Null передається в цю функцію, вона повертає Null. Це також може призвести до неочікуванних результатів, якщо користувач не дуже добре розбирається в тризначній логіці. Наприклад:
SELECT * FROM sometable WHERE LENGTH(string) < 20; -- Рядки де NULL не будуть повернуті.
Це ускладнюється фактом, що деякі утіліти показують NULL як порожній рядок, і порожній рядок може бути невірно збережений як NULL.
Критика
Реалізація Null в ISO SQL є предметом критики, суперечок і закликів до змін. Існують різні думки з цього приводу:
- Думка 1: З точки зору теорії реляційних баз даних, значення Null не потрібне, а його використання — наслідок помилки проектування бази даних. В БД розробленій в повній відповідності з критеріями нормалізації, не може бути стовпців без значень, тобто, не потрібна і спеціальна позначка для таких стовпців. Хоча на практиці, з міркувань ефективності, виявляється корисним знехтувати деякими правилами нормалізації, тоді, як один з видів плати за таке нехтування, з'являються відсутні значення, для позначення яких і був введений Null
- Думка 2: Null необхідний і обов'язковий для будь-якої БД, що претендує на реляційність. Зокрема без нього неможливо коректно побудувати зовнішнє об'єднання (
OUTER JOIN
) рядків з двох таблиць. Саме цієї точки зору притримувався Кодд, явно помістивши його як третього з 12 правил для реляційних СКБД. Саме цей принцип закріплений в останніх стандартах мови SQL.
Закон виключеного третього
SQL дозволяє три логічні вибори: істина, хиба і невідомо, що означає, що SQL неминуче ігнорує закон виключеного третього. Коротко закон стверджує, для отримання протилежного результату до будь-якого логічного результату достатньо застосувати оператор логічного «заперечення». Однак, його неможливо застосувати до SQL Null. Керуючись законом виключеного третього, наступний логічний вираз може бути спрощений:
SELECT * FROM stuff WHERE ( x = 10 ) OR NOT ( x = 10 );
Закон виключеного третього дозволяє спрощення предикату в пункті WHERE, отримавши в результаті наступне:
SELECT * FROM stuff;
Це не спрацює в SQL, через те, що x стовпець може містити Null, що призведе до повернення додаткових рядків.
Насправді:
SELECT * FROM stuff; -- (через тризначну логіку) тотожно з: SELECT * FROM stuff WHERE ( x = 10 ) OR NOT ( x = 10 ) OR x IS NULL;
Тобто, для вірного спрощення першого виразу в SQL необхідно повертати всі рядки де х не Null.
SELECT * FROM stuff WHERE x IS NOT NULL;
Ігнорування закону виключеного третього вводить додаткову складність в логіку SQL, спроби застосувати це правило в тризначній логіці SQL призводить фальшивої дихотомії.
Примітки
- Codd E.F. Is Your Database Really Relational? // . — .
- Codd E.F. Does Your DBMS Run By The Rules? // . — .
- Elmasri, R., & Navathe, S. (1994). Fundamentals of Database Systems. 2nd ed. Redwood City, CA: The Benjamin/Cummings Publishing Co. pp. 283 – 285
- Codd, E.F. (1990). The Relational Model for Database Management (вид. Version 2). Addison-Wesley. ISBN .
- ISO/IEC (2003). . ISO/IEC. Section 4.4.2: The null value. Архів оригіналу за 7 серпня 2008. Процитовано 10 травня 2022.
- Coles, Michael (27 червня 2005). . SQL Server Central. Red Gate Software. Архів оригіналу за 25 липня 2008. Процитовано 14 липня 2010.
- ISO/IEC (2003). ISO/IEC 9075-2:2003, "SQL/Foundation". ISO/IEC. Section 8.7: null predicate.
- Coles, Michael (26 лютого 2007). . SQL Server Central. Red Gate Software. Архів оригіналу за 25 квітня 2007. Процитовано 15 липня 2010.
- ISO/IEC (2003). ISO/IEC 9075-2:2003, "SQL/Foundation". ISO/IEC. Section 6.2.6: numeric value expressions..
- ISO/IEC (2003). ISO/IEC 9075-2:2003, "SQL/Foundation". ISO/IEC. Section 6.2.8: string value expression..
- ISO/IEC (2003). ISO/IEC 9075-2:2003, "SQL/Foundation". ISO/IEC. Section 4.15.4: Aggregate functions..
- ISO/IEC (2003). ISO/IEC 9075-2:2003, "SQL/Foundation". ISO/IEC. Section 3.1.6.8: Definitions: distinct.
- ISO/IEC (2003). ISO/IEC 9075-2:2003, "SQL/Foundation". ISO/IEC. Section 6.11: case expression..
Це незавершена стаття про бази даних. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina NULL Null specialne znachennya yake vikoristovuyetsya v SQL dlya poznachennya vidsutnosti danih NULL vidpovidaye ponyattyu porozhnye pole tobto pole yake ne mistit niyakogo znachennya Vvedeno vinahidnikom relyacijnoyi modeli danih Edgarom Koddom SQL Null sluguye dlya vikonannya vimogi sho vsi dijsno relyacijni sistemi keruvannya bazami danih RSKBD pidtrimuyut predstavlennya vidsutnoyi i nepridatnoyi informaciyi Kodd takozh vviv vikoristannya maloyi literi greckoyi omega w yak simvolu dlya predstavlennya Null v teoriyi baz danih NULL takozh ye zarezervovanim slovom v SQL yake vkazuye na specialnu poznachku Null Grecka litera omega w v nizhnomu registri vikoristovuyetsya dlya predstavlennya Null v teoriyi baz danih Null buv prichinoyu superechok i debativ cherez svoyu asociaciyu z trijkovoyu logikoyu osoblivih vimog z jogo vikoristannya v instrukciyi SQL JOIN i specialnoyi obrobki agregatnimi funkciyami ta operatorami grupuvannya SQL Hocha osoblivi funkciyi ta predikati pravilno obroblyayut Null oponenti vidchuvayut sho pidtrimka ciyeyi mozhlivosti vvodit nepotribnu skladnist i superechlivist v relyacijnu model danih IstoriyaNull buv vvedenij Edgarom Koddom yak zasib dlya predstavlennya vidsutnih danih v relyacijnij modeli nezalezhno vid tipu danih Vpodalshomu vin opublikuvav svoyu stattyu v dvoh chastinah v chasopisi ComputerWorld v cij statti vin prezentuvav 12 pravil za yakimi mozhna viznachiti chi ye SKBD dijsno relyacijnoyu Kodd takozh vviv triznachnu logiku yaka maye tri znachennya istinnosti Istina True Hiba False ta Nevidomo Unknown yaka duzhe blizka do koncepciyi Null Znachennya Nevidomo generuyetsya koli Null porivnyuyetsya z bud yakim znachennyam danih abo z Null U svoyij knizi The Relational Model for Database Management Version 2 Kodd zaznachiv sho yedinij Null prijnyatij v standarti SQL nedostatnij i maye buti zaminenij dvoma riznimi Null znachennyami dlya poznachennya prichini vidsutnosti Ci dvi Null poznachki zazvichaj zgaduyetsya yak A znachennya A Values ta I znachennya I Values sho predstavlyayut Vidsutnij ta prijnyatnij Missing But Applicable ta Vidsutnij ta neprijnyatnij Missing But Inapplicable vidpovidno Rekomendaciya Kodda vimagala rozshirennya logichnoyi strukturi SQL dlya vidpovidnosti chotiriznachnij logichnij sistemi Cherez cyu dodatkovu skladnist ideya ne otrimala shiroko rozpovsyudzhennya Triznachna logikaCherez te sho Null ne ye chlenom bud yakogo domenu danih mi jogo ne sprijmayemo yak znachennya radshe yak poznachku vidsutnosti danih Cherez ce porivnyannya z Null nikoli ne dast v rezultati Istina abo Hiba rezultat bude zavzhdi tretim logichnim znachennyam Nevidomo Logichnij rezultat nastupnogo virazu sho porivnyuye 10 z Null Nevidomo SELECT 10 NULL V rezultati Nevidomo Odnak pevni virazi z Null mozhut povertati znachennya yaksho Null ne vplivaye na vihidne znachennya virazu Pripustimo sho v nastupnomu prikladi drugij operand obchislyuyetsya tilki yaksho v comu vinikla potreba SELECT TRUE OR NULL V rezultati Istina V comu vipadku fakt togo sho znachennya pravoruch vid OR nevidome ne vplivaye na kinevij rezultat SQL realizuye tri logichnih znachennya takim chinom realizaciyi SQL mayut zabezpechuvati triznachnu logiku Kerivni pravila triznachnoyi logiki v SQL pokazani v tablici nizhche p i q predstavlyayut logichni stani p q p OR q p AND q p q True True True True True True False True False False True Nevidomij True Nevidomij Nevidomij False True True False False False False False False True False Nevidomij Nevidomij False Nevidomij Nevidomij True True Nevidomij Nevidomij Nevidomij False Nevidomij False Nevidomij Nevidomij Nevidomij Nevidomij Nevidomij Nevidomij p NOT p True False False True Nevidomij Nevidomij Bazovi operatori porivnyannya v SQL zavzhdi povertayut Nevidomo koli shos porivnyuyetsya z Null takim chinom standart SQL zabezbechuye dva specialnih porivnyalnih perdikata dlya Null IS NULL ta IS NOT NULL predikati pereviryayut koli dani Null chi ni Tipizaciya danih Null v SQL netipizovanij tobto vin ne rozpiznayetsya yak cile simvol chi bud yakij inshij tip danih Cherez ce chasom duzhe vazhlivo yavno privoditi Null do pevnogo tipu danih Napriklad yaksho perevantazheni funkciyi pidtrimuyutsya RSKBD SQL mozhe buti nespromozhnim avtomatichno vibrati pravilnu funkciyu bez znannya tipiv danih vsih parametriv vklyuchno z timi de peredayetsya Null Mova manipulyuvannya danimi Triznachna logika SQL zustrichayetsya v movi manipulyuvannya danimi v predikatah porivnyannya v DML virazah i zapitah Punkt WHERE vimagaye vid DML virazu diyati tilki dlya ryadkiv na yakih predikat povertaye Istina Ryadki na yakih predikat povertaye Hiba abo Nevidomo ne piddayutsya diyi DML viraziv a href wiki Insert SQL title Insert SQL INSERT a a href wiki Update SQL title Update SQL UPDATE a chi a href wiki Delete SQL title Delete SQL DELETE a a takozh vidkidayutsya DML zapitom a href wiki Select SQL title Select SQL SELECT a Rozuminnya Nevidomo i Hiba yak odnogo i togo samogo rezultatu ye pomilkoyu yaka chasto zustrichayetsya pri roboti z Null Nastupnij priklad pokazuye taku pomilku SELECT FROM t WHERE i NULL Navedenij zapit zavzhdi bude povertati nul ryadkiv cherez te sho porivnyannya stovpcya i z Null zavzhdi daye Nevidomo navit dlya ryadkiv de i dorivnyuye Null sho zmushuye SELECT vidkinuti vsi ryadki Odnak na praktici deyakij SQL instrumentrarij povertaye ryadki pri vikoristanni porivnyannya z Null CASE virazi SQL virazi CASE diyut za timi zh pravilami obrobki Null sho i DML punkt WHERE Cherez te sho cej viraz mozhna traktuvati yak poslidovnist umov na rivnist prostij viraz CASE ne mozhe pryamo pereviriti na prisutnist Null Perevirka na Null v prostomu virazi CASE zavzhdi povertaye Nevidomo yak v nastupnomu prikladi SELECT CASE i WHEN NULL THEN Is Null Cej variant nikoli ne spracyuye WHEN 0 THEN Is Zero Spracyuye koli i 0 WHEN 1 THEN Is One Spracyuye koli i 1 END FROM t Zavdyaki tomu sho i NULL obchislyuyetsya yak Nevidomo nevazhlivo sho mistitsya v stovpci i navit yaksho tam Null ryadok Is Null nikoli ne bude povernutij Poshukovij viraz CASE takozh povertaye pershe znachennya dlya yakogo predikat porivnyannya povertaye Istina vklyuchno z porivnyannyami sho vikoristovuyut IS NULL ta IS NOT NULL Nastupnij priklad pokazuye yak vikoristovuvati poshukovij viraz CASE dlya pravilnoyi perevirki na Null SELECT CASE WHEN i IS NULL THEN Null Result Spracyuye koli i bude NULL WHEN i 0 THEN Zero Spracyuye koli i 0 WHEN i 1 THEN One Spracyuye koli i 1 END FROM t V poshukovomu virazi CASE ryadok Null Result bude povernuto dlya vsih ryadkiv de i bude Null Check constraint Pervinne misce de triznachna logika SQL peretinayetsya z SQL movoyu opisu danih DDL ce v formi Perevirka na obmezhennya rozmishena na stvopci diye za desho riznimi pravila porivnyano z DML punktom WHERE Yaksho DML punkt WHERE maye otrimati Istina dlya ryadka todi yak perevirka na obmezhennya maye otrimati ne Hiba Ce oznachaye sho perevirka na obmezhennya bude uspishno projdena yaksho rezultat bude Istina abo Nevidomo Tablicya z perevirkoyu na obmezhennya v nastupnomu prikladi zaboronyaye vstavlyannya bud yakih cilih znachen v stovpec i ale vona dozvolyaye vstavlyati Null zavdyaki tomu sho rezultat perevirki bude Nevidomo CREATE TABLE t i INTEGER CONSTRAINT ck i CHECK i lt 0 AND i 0 AND i gt 0 Dlya zaboroni vstavlennya znachen Null mozhna zastosuvati NOT NULL yak pokazano v nastupnomu prikladi Obmezhennya NOT NULL semantichno totozhno perevirci na obmezhennya z predikatomIS NOT NULL CREATE TABLE t i INTEGER NOT NULL Procedurni rozshirennya SQL PSM SQL Persistent Stored Modules viznachaye procedurni rozshirennya dlya SQL taki yak viraz a href wiki D0 A3 D0 BC D0 BE D0 B2 D0 BD D0 B8 D0 B9 D0 BF D0 B5 D1 80 D0 B5 D1 85 D1 96 D0 B4 title Umovnij perehid IF a Odnak golovni postachalniki SQL produktiv mayut svoyi istorichno vklyucheni procedurni rozshirennya Procedurni rozshirennya dlya organizaciyi cikliv i porivnyan diyut iz Null porivnyannyami shozhim chinom z DML virazami i zapitami Nastupnij fragment kodu v formati standartu ISO SQL vikoristovuye Null triznachnu logiku v virazi IF IF i NULL THEN SELECT Rezultat Istina ELSEIF NOT i NULL THEN SELECT Rezultat Hiba ELSE SELECT Rezultat Nevidomo Viraz IF vikonuye diyu tilki yaksho porivnyannya obchislyuyetsya yak Istina Dlya viraziv yaki obchislyuyutsya yak Hiba abo Nevidomo IF peredaye keruvannya v punkt ELSEIF i potim v punkt ELSE Rezultatom poperednogo kodu bude zavzhdi povidomlennya Rezultat Nevidomo zavdyaki tomu sho porivnyannya z Null zavzhdi povertaye Nevidomo Ob yednannyaPriklad zovnishnogo ob yednannya v zapiti z Null zapovnyuvachami v rezultatnomu nabori Null poznachki predstavleni slovom NULL na misci danih v viborci Vibirka z Microsoft SQL Server pokazana v SQL Server Management Studio Zovnishnye ob yednannya v SQL vklyuchno z livim zovnishnim ob yednannyam pravim zovnishnim ob yednannyam ta povnim zovnishnim ob yednannyam avtomatichno pidstavlyaye Null yak zapovnyuvach dlya vidsutnih znachen u vidpovidnih tablicyah Napriklad dlya livih zovnishnih ob yednan Null generuyetsya na miscyah z tablic sho znahodyatsya pravoruch vid operatora LEFT OUTER JOIN Nastupnij prostij priklad vikoristovuye dvi tablici dlya demonstraciyi pidstanovki Null zaminnika pri livomu zovnishnomu ob yednanni Persha tablicya Employee mistit ID sluzhbovciv ta imena todi yak druga tablicya PhoneNumber mistit vidpovidno ID sluzhbovciv ta telefonni nomeri Employee ID LastName FirstName 1 Skvira Stepan 2 Vorohta Vasil 3 Toloka Tetyana 4 Balabuh Borislav PhoneNumber ID Number 1 555 2323 3 555 9876 Nastupnij SQL zapit vikonuye live zovnishnye ob yednannya na cih dvoh tablicyah SELECT e ID e LastName e FirstName pn Number FROM Employee e LEFT OUTER JOIN PhoneNumber pn ON e ID pn ID Rezultatnij nabir cogo zapitu pokazuye yak SQL vikoristovuye Null yak zaminnik dlya znachen vidsutnih v tablici PhoneNumber Query Result ID LastName FirstName Number 1 Skvira Stepan 555 2323 2 Vorohta Vasil NULL 3 Toloka Tetyana 555 9876 4 Balabuh Borislav NULL Vnutrishnye ob yednannya yake takozh prisutnye v standarti SQL ne produkuye Null zamist vidsutnih znachen v vidpovidnih tablicyah Treba buti oberezhnim vikoristovuyuchi stovpci z mozhlivimi znachennyami Null v kriteriyah ob yednan SQL Cherez te sho Null ne dorivnyuye inshomu Null Null v stovpci odniyeyi tablici ne bude ob yeduvatis z Null v parnij tablici shlyahom vikoristannya standartnih operatoriv dlya perevirki rivnosti SQL funkciya COALESCE abo virazi CASE mozhut buti vikoristani dlya takoyi perevirki v kriteriyah ob yednannya IS NULL i IS NOT NULL predikati takozh mozhut buti vikoristani v kriteriyah ob yednannya Nastupnij viraz pereviryaye na rivnist znachennya A i B i traktuye Null i yak rivni znachennya Operator IFNULL neobhidnij z oglyadu na te sho A B povertaye Null yaksho hocha b odne znachennya ye Null i NULL OR FALSE ye Null IFNULL A B FALSE OR A IS NULL AND B IS NULL Matematichni operaciyi ta ob yednannya ryadkivCherez te sho Null ne tip danih a prosto poznachka nevidomogo znachennya vikoristannya matematichnih operatoriv z Null povertaye nevidome znachennya yake predstavlyayetsya za dopomogoyu Null V nastupnomu prikladi dobutok 10 ta Null povertaye Null 10 NULL Rezultat NULL Ce mozhe prizvesti do neochikuvanih rezultativ Napriklad pri sprobi rozdiliti Null na nul platforma mozhe povernuti Null zamist generuvannya pomilki dilennya na nul data exception division by zero Hoch povedinka v cij situaciyi ne viznachena standartom ISO SQL bagato SKBD traktuyut cyu operaciyu shozhim chinom Napriklad Oracle PostgreSQL MySQL Server i Microsoft SQL Server povernut Null yak rezultat nastupnogo virazu NULL 0 Operaciya konkatenaciyi ryadkiv yaka chasto zustrichayetsya v SQL takozh produkuye Null koli odin z operandiv Null Nastupnij priklad pokazuye yak rezultat Null bude povernenij pri vikoristanni Null u SQL operaciyi z yednannya strichok z vikoristannyam operatora Fish NULL Chips Rezultat NULL Ce ne virno dlya vsih realizacij baz danih Napriklad v Oracle NULL ta porozhnij ryadok traktuyutsya odnakovo takim chinom Fish NULL Chips povertaye Fish Chips Agregatni funkciyiSQL viznachaye agregatni funkciyi dlya sproshennya agregatnih obchislen na serveri Majzhe vsi agregatni funkciyi vikonuyut krok z viklyuchennya Null takim chinom Null znachennya ne vklyuchayutsya v rezultat obchislen Take neyavne viklyuchannya Null mozhe vidbitisya na rezultati obchislen agregatnoyi funkciyi Nastupna tablicya vidaye rizni rezultati dlya kozhnogo stovpcya pri zastosuvanni agregatnoyi funkciyi AVG Table i j 150 150 200 200 350 350 NULL 0 Agregatna funkciya AVG zastosovana do stovpcya i povertaye 233 i 175 koli mi zastosovuyemo yiyi do stovpcya j Krok z viklyuchennya Null prizvodit do riznici v rezultati Yedina agregatna funkciya yaka ne viklyuchaye Null ce funkciya COUNT Grupuvannya ta sortuvannyaCherez te sho SQL 2003 viznachaye poznachki Null yak nerivni odna odnij dodatkove viznachennya bulo neobhidne dlya grupuvannya Null razom pri vikonanni pevnih operacij SQL viznachaye bud yaki dva znachennya yaki rivni mizh soboyu abo bud yaki dva Null yak nerizni Ce viznachennya neriznosti dlya grupuvannya ta sortuvannya poznachok Nulls koli punkt GROUP BY abo inshi klyuchovi slova sho vikonuyut grupuvannya vikoristovuyutsya Inshi SQL operatori virazi ta klyuchovi slova vikoristovuyut nerizni v yihnomu traktuvanni poznachok Null Virno dlya nastupnih PARTITION BY razom iz ROW NUMBER UNION INTERSECT ta EXCEPT operatori sho traktuyut NULL yak rivni dlya porivnyannya viklyuchenya ryadkiv DISTINCT v zapiti SELECT Stovpci v yakih ne dozvoleno zberigati bilshe odnogo Null napriklad stovpci z obmezhennyam na unikalnist Standart SQL ne viznachaye yavno poryadok sortuvannya za umovchannyam dlya poznachok Null Zamist cogo Null mozhut buti vidsortovani pered abo pislya vsih danih vikoristovuyuchi NULLS FIRST abo NULLS LAST punkt virazu ORDER BY Hocha j ne vsi postachalniki SKBD pidtrimuyut cyu funkcionalnist Postachalniki yaki ne realizuyut cyu funkcionalnist mozhut viznachiti rizni traktuvannya dlya sortuvannya poznachok Null v SKBD Funkciyi obrobki NullSQL viznachaye dvi funkciyi obrobki Null COALESCE i NULLIF Obidvi funkciyi ye skorochennyami dlya poshukovih viraziv CASE COALESCE Funkciya COALESCE prijmaye spisok parametriv i povertaye pershe ne Null znachennya zi spisku COALESCE value1 value2 value3 COALESCE viznachena yak umovne poznachennya dlya nastupnogo SQL CASE virazu CASE WHEN value1 IS NOT NULL THEN value1 WHEN value2 IS NOT NULL THEN value2 WHEN value3 IS NOT NULL THEN value3 END Deyaki SQL SKBD realizuyut specifichni funkciyi podibni do COALESCE Napriklad realizuyut funkciyu ISNULL abo inshi shozhi funkciyi yaki funkcionalno podibni do COALESCE NULLIF abo NVL Funkciya NULLIF prijmaye dva parametri Yaksho pershij parametr dorivnyuye drugomu NULLIF povertaye Null Inakshe povertayetsya znachennya pershogo parametra NULLIF value1 value2 Tobto NULLIF ye skorochennyam dlya nastupnogo virazu CASE CASE WHEN value1 value2 THEN NULL ELSE value1 END Viraz COALESCE mozhe buti privedenij do ekvivalentnogo virazu NVL u takij sposib COALESCE val1 val n perehodit v NVL val1 NVL val2 NVL val3 NVL val n 1 val n SuperechkaZagalni pomilki Nepravilne rozuminnya yak Null pracyuye staye prichinoyu velikoyi kilkosti pomilok v SQL kodi yak v ISO SQL virazah tak i v specifichnih dialektah SQL realnih sistem baz danih Ci pomilki zazvichaj vinikayut v rezultati plutannya mizh Null i abo 0 nul abo porozhnim ryadkom ryadkom zi znachennyam nulovoyi dovzhini predstavlenim v SQL yak ISO SQL standart viznachaye Null yak vidminnij vid porozhnogo ryadka ta chislovogo znachchennya 0 V toj chas yak Null poznachaye vidsutnist znachennya porozhnij ryadok abo cifra nul predstavlyayut realni znachennya Napriklad punkt WHERE abo umovnij viraz porivnyuyut znachennya v stovpci iz konstantoyu Chasto nevirno pripuskayetsya sho vidsutnye znachennya bude menshe nizh abo ne dorivnyuvatime konstanti ale naspravdi viraz povertaye Nevidomo Yak v prikladi nizhche SELECT FROM sometable WHERE num lt gt 1 Ryadki de num ye NULL ne budut povernuti protilezhno do ochikuvan bagatoh koristuvachiv Shozhim chinom Null znachennya chasto plutayut z porozhnimi ryadkami Pripustimo isnuvannya funkciyi LENGTH yaka povertaye kilkist znakiv v ryadku Koli Null peredayetsya v cyu funkciyu vona povertaye Null Ce takozh mozhe prizvesti do neochikuvannih rezultativ yaksho koristuvach ne duzhe dobre rozbirayetsya v triznachnij logici Napriklad SELECT FROM sometable WHERE LENGTH string lt 20 Ryadki de NULL ne budut povernuti Ce uskladnyuyetsya faktom sho deyaki utiliti pokazuyut NULL yak porozhnij ryadok i porozhnij ryadok mozhe buti nevirno zberezhenij yak NULL Kritika Realizaciya Null v ISO SQL ye predmetom kritiki superechok i zaklikiv do zmin Isnuyut rizni dumki z cogo privodu Dumka 1 Z tochki zoru teoriyi relyacijnih baz danih znachennya Null ne potribne a jogo vikoristannya naslidok pomilki proektuvannya bazi danih V BD rozroblenij v povnij vidpovidnosti z kriteriyami normalizaciyi ne mozhe buti stovpciv bez znachen tobto ne potribna i specialna poznachka dlya takih stovpciv Hocha na praktici z mirkuvan efektivnosti viyavlyayetsya korisnim znehtuvati deyakimi pravilami normalizaciyi todi yak odin z vidiv plati za take nehtuvannya z yavlyayutsya vidsutni znachennya dlya poznachennya yakih i buv vvedenij Null Dumka 2 Null neobhidnij i obov yazkovij dlya bud yakoyi BD sho pretenduye na relyacijnist Zokrema bez nogo nemozhlivo korektno pobuduvati zovnishnye ob yednannya OUTER JOIN ryadkiv z dvoh tablic Same ciyeyi tochki zoru pritrimuvavsya Kodd yavno pomistivshi jogo yak tretogo z 12 pravil dlya relyacijnih SKBD Same cej princip zakriplenij v ostannih standartah movi SQL Zakon viklyuchenogo tretogo SQL dozvolyaye tri logichni vibori istina hiba i nevidomo sho oznachaye sho SQL neminuche ignoruye zakon viklyuchenogo tretogo Korotko zakon stverdzhuye dlya otrimannya protilezhnogo rezultatu do bud yakogo logichnogo rezultatu dostatno zastosuvati operator logichnogo zaperechennya Odnak jogo nemozhlivo zastosuvati do SQL Null Keruyuchis zakonom viklyuchenogo tretogo nastupnij logichnij viraz mozhe buti sproshenij SELECT FROM stuff WHERE x 10 OR NOT x 10 Zakon viklyuchenogo tretogo dozvolyaye sproshennya predikatu v punkti WHERE otrimavshi v rezultati nastupne SELECT FROM stuff Ce ne spracyuye v SQL cherez te sho x stovpec mozhe mistiti Null sho prizvede do povernennya dodatkovih ryadkiv Naspravdi SELECT FROM stuff cherez triznachnu logiku totozhno z SELECT FROM stuff WHERE x 10 OR NOT x 10 OR x IS NULL Tobto dlya virnogo sproshennya pershogo virazu v SQL neobhidno povertati vsi ryadki de h ne Null SELECT FROM stuff WHERE x IS NOT NULL Ignoruvannya zakonu viklyuchenogo tretogo vvodit dodatkovu skladnist v logiku SQL sprobi zastosuvati ce pravilo v triznachnij logici SQL prizvodit falshivoyi dihotomiyi PrimitkiCodd E F Is Your Database Really Relational Codd E F Does Your DBMS Run By The Rules Elmasri R amp Navathe S 1994 Fundamentals of Database Systems 2nd ed Redwood City CA The Benjamin Cummings Publishing Co pp 283 285 Codd E F 1990 The Relational Model for Database Management vid Version 2 Addison Wesley ISBN 0 201 14192 2 ISO IEC 2003 ISO IEC Section 4 4 2 The null value Arhiv originalu za 7 serpnya 2008 Procitovano 10 travnya 2022 Coles Michael 27 chervnya 2005 SQL Server Central Red Gate Software Arhiv originalu za 25 lipnya 2008 Procitovano 14 lipnya 2010 ISO IEC 2003 ISO IEC 9075 2 2003 SQL Foundation ISO IEC Section 8 7 null predicate Coles Michael 26 lyutogo 2007 SQL Server Central Red Gate Software Arhiv originalu za 25 kvitnya 2007 Procitovano 15 lipnya 2010 ISO IEC 2003 ISO IEC 9075 2 2003 SQL Foundation ISO IEC Section 6 2 6 numeric value expressions ISO IEC 2003 ISO IEC 9075 2 2003 SQL Foundation ISO IEC Section 6 2 8 string value expression ISO IEC 2003 ISO IEC 9075 2 2003 SQL Foundation ISO IEC Section 4 15 4 Aggregate functions ISO IEC 2003 ISO IEC 9075 2 2003 SQL Foundation ISO IEC Section 3 1 6 8 Definitions distinct ISO IEC 2003 ISO IEC 9075 2 2003 SQL Foundation ISO IEC Section 6 11 case expression Ce nezavershena stattya pro bazi danih Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi