JavaRush /Курсы /Модуль 4. Работа с БД /Специальное значение NULL

Специальное значение NULL

Модуль 4. Работа с БД
1 уровень , 4 лекция
Открыта

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

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

1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0145
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля description равное NULL
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0146
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля description равное NULL И значение поля required равное true
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0147
Выбрать колонки required, identifier, description (в указанном порядке) из таблицы parts, у которых значение поля description равное NULL ИЛИ значение поля required равное true
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0148
Выбрать колонки required, identifier, description (в указанном порядке) из таблицы parts, у которых значение поля description не равное NULL
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0149
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля description не равное NULL или значение поля identifier равное NULL
1
Задача
Модуль 4. Работа с БД, 1 уровень, 4 лекция
Недоступна
task0150
Выбрать все колонки (используй *) из таблицы parts, у которых значение поля id между 7 и 23 включительно И значение поля identifier равное NULL. Выбрать только первых 2 записи
Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Михаил Уровень 111 Expert
22 октября 2023
В task0150 наберите SELECT * FROM parts; Данные совсем не те, что в init_data.sql. И ответ поэтому другой
Олег Уровень 111 Expert
7 сентября 2023
Логическая ошибка: Если ты хочешь проверить не равна ли колонка твоей таблицы NULL, то нужно писать IS NOT NULL. Фраза "Если ты хочешь проверить не равна ли колонка твоей таблицы NULL" означает, что ты хочешь проверить, равна ли колонка NULL, а нам требуется противоположное: "Если ты хочешь проверить, что твоя колонка не равна NULL."
Madina Baizhanova Уровень 29
23 августа 2023
рост Уровень 32
20 февраля 2023
блин класс то что я искал
dionisis2010 Уровень 1
7 февраля 2023
Лекцию нудно скорректировать, в java и sql null несет в себе в корне разный смысл. В java null это "пустота", что вполне укладывается в бинарную логику, В sql null это "неопределенность", для которой работают правила троичной логики (нагуглите). (В JS к слову есть оба понятия: null = "пустота" и undefined = "неопределенность")
aDuVaN4Ik Уровень 42
1 января 2023
Код прям очень похож на предложение на английском что не может не радовать.
Михаил Уровень 34
11 июля 2023
Изначально SQL пытались сделать так, чтоб его могли использовать не только программисты, спасибо тому кто это придумал
Мария Уровень 111 Expert
16 августа 2023
Да, со знанием английского несколько проще, но потом, когда уже сложные запросы пойдут, он не поможет.)
Уровень 51
23 декабря 2022
запахло шарпом))
Sidroded Уровень 32
27 января 2023
302 уровень? Это как вообще так вышло?
Dmytryi Shubchynskyi Уровень 111 Expert
13 февраля 2023
три раза прошел