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 |
Добре, два останні рядки зникли. Ось як це працює. Трохи незвично, але все ж таки певна логіка в цьому є.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ