5.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 |
Да, я добавил в таблицу заклепки и шурупы. У них есть цена и количество, но нет бренда.
5.2 Сравнение с NULL
Помнишь, что тебя иногда бесило в Java при использовании null? Что нельзя сравнивать переменные, которые могут ссылаться на null-значения через equals(). Пример:
Product product1 = new 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.
5.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 |
Отлично, две последних строки исчезли. Вот как это работает. Немного непривычно, но все же определенная логика в этом есть.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ