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

Отлично, две последних строки исчезли. Вот как это работает. Немного непривычно, но все же определенная логика в этом есть.

undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0145
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля description равное NULL
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0146
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля description равное NULL И значение поля required равное true
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0147
Выбрать колонки required, identifier, description (в указанном порядке) из таблицы parts, у которых значение поля description равное NULL ИЛИ значение поля required равное true
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0148
Выбрать колонки required, identifier, description (в указанном порядке) из таблицы parts, у которых значение поля description не равное NULL
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0149
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля description не равное NULL или значение поля identifier равное NULL
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0150
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля id между 7 и 23 включительно И значение поля identifier равное NULL. Выбрать только первых 2 записи