Специальное значение NULL
В языке 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
То получишь пустую таблицу:
Но если в запросе написать, что brand не равно NULL , получишь тот же результат:
SELECT * FROM product WHERE brand != NULL
Ты опять получишь пустую таблицу:
Любое сравнение / действие с NULL будет давать NULL :
Да, даже если сравнивать NULL с NULL, то в ответе будет NULL .
5.3 IS NULL и IS NOT NULL
Так как же нам проверить, что какое-то поле (или какая-то колонка) имеет значение NULL ? А для этого в языке SQL есть специальное выражение – IS NULL . Выглядит это так.
Если ты хочешь проверить не равна ли колонка твоей таблицы NULL , то нужно писать IS NOT NULL :
Давай напишем запрос, который отберет все продукты из таблицы product, чей бренд равен NULL . Выглядеть такой запрос будет так:
SELECT * FROM product WHERE brand IS NULL
И получим такой результат запроса:
А теперь давай отобразим все продукты, цена которых меньше 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
Получим такой результат запроса:
Отлично, две последних строки исчезли. Вот как это работает. Немного непривычно, но все же определенная логика в этом есть.