1. Відсутність значення

У мові SQL, як і в мові Java, є спеціальне ключове слово на позначення відсутності значення — це null. Або як це часто пишуть — NULL.

Використання NULL у SQL дуже схоже на використання null в Java. У Java можуть бути об'єкти, поля яких містять null-значення. У SQL можуть бути таблиці, рядки яких містять значення NULL.

Давай я спеціально додам до нашої таблиці product пару продуктів без бренду. Якщо бренд продукту невідомий, то значення буде NULL.

Щоб відобразити такі продукти, відсортуємо нашу таблицю product за id у зворотному порядку та візьмемо 10 записів. Запит буде мати такий вигляд:


SELECT * FROM product
ORDER BY id DESC
LIMIT 10
        

Отримаємо такий результат запиту:

id name brand price count
15 Заклепка NULL 0.01 1000
14 Шуруп NULL 0.10 1000
13 Підставка IKEA 100.00 10
12 Вазон SmartFlower 99.00 9
11 Крісло Bosch 44.00 8
10 Плита Bosch 199.00 10
9 Комод IKEA 99.00 10
8 Лампа LG 15.00 100
7 Телевізор LG 350.00 4
6 Полиця Bosch 25.00 114

Так, я додав до таблиці заклепки та шурупи. У них є ціна та кількість, але немає бренду.

2. Порівняння з NULL

Пам'ятаєш, що тебе іноді дратувало в Java при використанні null? Що не можна порівнювати змінні, які можуть посилатися на null-значення через equals(). Приклад:


Product product1 = новий Product();
Product product2 = null;
if (product2.equals(product1) { //тут виникне виняток
…
}

Ти не повіриш, але в мові SQL на тебе теж чекають нюанси під час роботи з NULL-значеннями. І звучить цей нюанс приблизно так: ніщо не дорівнює NULL.

Якщо спробуєш відфільтрувати всі продукти, чий бренд дорівнює null:


SELECT * FROM product
WHERE brand = NULL
        

То отримаєш порожню таблицю:

id name brand price count

Але якщо в запиті вказати, що brand не дорівнює NULL, отримаєш той самий результат:


SELECT * FROM product
WHERE brand != NULL
        

Знову порожня таблиця:

id name brand price count

Будь-яке порівняння / дія з NULL даватиме NULL:

Вираз Результат
brand=NULL NULL
brand != NULL NULL
NULL = NULL NULL
NULL != NULL NULL

Так, навіть якщо порівнювати NULL з NULL, то у відповіді буде NULL.

3. IS NULL та IS NOT NULL

Тож як нам перевірити, що якесь поле (або якась колонка) має значення NULL? А для цього у мові SQL є спеціальний вираз — IS NULL. Це виглядає так.


змінна IS NULL
        

Якщо ти хочеш перевірити, чи не дорівнює колонка твоєї таблиці NULL, потрібно писати IS NOT NULL:


змінна IS NOT NULL
        

Давай напишемо запит, який відбере всі продукти з таблиці product, бренд якого дорівнює NULL. Виглядатиме цей запит таким чином:


SELECT * FROM product
WHERE brand IS NULL
        

І отримаємо такий результат запиту:

id name brand price count
14 Шуруп NULL 0.10 1000
15 Заклепка NULL 0.01 1000

А тепер давай відобразимо всі продукти, ціна яких менша за 20 доларів:


SELECT * FROM product
WHERE price  < 20
        

І отримаємо такий результат запиту:

id name brand price count
2 Стілець IKEA 5.00 45
8 Лампа LG 15.00 100
14 Шуруп NULL 0.10 1000
15 Заклепка NULL 0.01 1000

Тепер вкажемо, що ціна має бути меншою за 20 доларів і бренд не NULL.


SELECT * FROM product
WHERE price  < 20 AND brand IS NOT NULL

        

Отримаємо такий результат запиту:

id name brand price count
2 Стілець IKEA 5.00 45
8 Лампа LG 15.00 100

Добре, два останні рядки зникли. Ось як це працює. Трохи незвично, але все ж таки певна логіка в цьому є.