Перейти к содержанию
Educora
Начальный16 мин4 / 22

LIKE, IN, BETWEEN и IS NULL

Научись искать по шаблону (LIKE), сравнивать со списком значений (IN), выбирать диапазон (BETWEEN) и работать с отсутствующими данными (NULL).

Проверь себя
В этом уроке ты узнаешь
  • Искать текст с помощью LIKE и символов % и _
  • Короче записывать условия с помощью IN и BETWEEN
  • Понимать, что такое NULL, и пользоваться IS NULL и COALESCE

Когда в поле поиска вводишь лишь часть фамилии, сайт всё равно находит нужного человека. А как найти «учеников из Сумгайыта, Губы или Нахчывана», «товары ценой от 10 до 55» или «учеников без e-mail»? Для этого в SQL есть четыре специальных оператора: LIKE, IN, BETWEEN и IS NULL.

LIKE: поиск по шаблону

LIKE сравнивает текст с шаблоном. В шаблоне есть два специальных символа: % заменяет любое количество символов (даже ноль), а _ — ровно один символ.

ШаблонЧему соответствуетПример значения
'A%'начинается с AAysel
'%ova'заканчивается на ovaAbbasova
'%set%'содержит setChess set
'_u%'вторая буква — uMurad
'____'ровно четыре символаQuba
SQL
SELECT first_name, last_name
FROM students
WHERE last_name LIKE '%ova'
ORDER BY id;
▸ Ожидаемый результат
first_name | last_name
Aysel | Məmmədova
Leyla | Hüseynova
Günay | Abbasova
Səbinə | Nəsirova
Fidan | Cəfərova
Ученицы, чья фамилия заканчивается на «ova».
SQL
SELECT first_name
FROM students
WHERE first_name LIKE '_u%'
ORDER BY id;
▸ Ожидаемый результат
first_name
Murad
Tural
_ — ровно один символ, % — всё остальное.

IN: список значений

Писать city = 'Sumqayıt' OR city = 'Quba' OR city = 'Naxçıvan' долго и утомительно. Оператор IN позволяет сказать то же самое коротко: условие истинно, если значение есть в списке в скобках. NOT IN, наоборот, выбирает значения, которых в списке нет.

SQL
SELECT first_name, city
FROM students
WHERE city IN ('Sumqayıt', 'Quba', 'Naxçıvan')
ORDER BY id;
▸ Ожидаемый результат
first_name | city
Elvin | Sumqayıt
Səbinə | Quba
Fidan | Naxçıvan
Orxan | Sumqayıt
SQL
SELECT name, category
FROM products
WHERE category NOT IN ('Electronics', 'Stationery')
ORDER BY id;
▸ Ожидаемый результат
name | category
Backpack | Accessories
Desk lamp | Home
Water bottle | Accessories
Chess set | Games

BETWEEN: диапазон

Условие x BETWEEN a AND b равносильно x >= a AND x <= b, то есть обе границы включаются. Ниже в результат попадает и Backpack, который стоит ровно 55. Меньшее значение всегда пишут первым: BETWEEN 55 AND 10 ничего не вернёт.

SQL
SELECT name, price
FROM products
WHERE price BETWEEN 10 AND 55
ORDER BY price;
▸ Ожидаемый результат
name | price
Water bottle | 12
Desk lamp | 34.99
Chess set | 42
Backpack | 55
SQL
SELECT id, customer_id, order_date
FROM orders
WHERE order_date BETWEEN '2025-02-01' AND '2025-03-31'
ORDER BY order_date;
▸ Ожидаемый результат
id | customer_id | order_date
3 | 2 | 2025-02-02
4 | 3 | 2025-02-10
5 | 4 | 2025-03-05
6 | 5 | 2025-03-18
Заказы за февраль и март. Если бы в датах было ещё и время (2025-03-31 14:00), вечер 31 марта уже не попал бы в диапазон.

NULL: данных нет

Определение
NULL

Особая отметка, означающая, что значение отсутствует или неизвестно. NULL — это не ноль и не пустая строка (''), а просто «данных нет».

Любое сравнение или вычисление с неизвестным значением даёт неизвестный результат — NULL. Даже NULL = NULL — не истина, а NULL: мы не знаем, равны ли два неизвестных значения. А WHERE оставляет только строки, для которых условие истинно.

SQL
SELECT NULL = NULL AS a,
       NULL + 5    AS b,
       5 > NULL    AS c;
▸ Ожидаемый результат
a | b | c
NULL | NULL | NULL
SQL
-- wrong: the condition is never true
SELECT COUNT(*) AS found
FROM students
WHERE email = NULL;
▸ Ожидаемый результат
found
0
COUNT(*) считает найденные строки. С = NULL ничего не находится, хотя у двух учеников нет e-mail.
SQL
-- right: IS NULL
SELECT first_name, last_name, email
FROM students
WHERE email IS NULL
ORDER BY id;
▸ Ожидаемый результат
first_name | last_name | email
Elvin | Quliyev | NULL
Tural | İsmayılov | NULL

IS NOT NULL выбирает строки, в которых значение есть. Чтобы показать в результате что-то вместо NULL, используют функцию COALESCE(a, b, ...): она возвращает первое значение из списка, которое не равно NULL. В SQLite и MySQL есть короткий вариант IFNULL(a, b), в SQL Server — ISNULL(a, b), а COALESCE работает везде.

SQL
SELECT first_name,
       COALESCE(email, 'no email') AS contact
FROM students
WHERE grade = 11
ORDER BY id;
▸ Ожидаемый результат
first_name | contact
Elvin | no email
Tural | no email
Fidan | fidan@example.com
Пример задачи

Найди учеников из Баку или Сумгайыта в возрасте 14–15 лет, у которых есть e-mail.

Показать решение
Объединяем три условия через AND:
город есть в списке — city IN ('Bakı', 'Sumqayıt');
возраст в диапазоне — age BETWEEN 14 AND 15;
e-mail указан — email IS NOT NULL.
Результат: Айсель, Лейла, Камран и Орхан. Эльвин тоже из Сумгайыта, но ему 17 лет и у него нет e-mail.
SQL
SELECT first_name, city, age
FROM students
WHERE city IN ('Bakı', 'Sumqayıt')
  AND age BETWEEN 14 AND 15
  AND email IS NOT NULL
ORDER BY id;
▸ Ожидаемый результат
first_name | city | age
Aysel | Bakı | 15
Leyla | Bakı | 14
Kamran | Bakı | 15
Orxan | Sumqayıt | 14
Задание

Выведи название и цену товаров стоимостью от 30 до 150 (включительно) из категорий Electronics, Home или Games. Отсортируй по возрастанию цены.

Задание · SQL
SELECT name, price
FROM products
-- use BETWEEN and IN
ORDER BY price;
▸ Ожидаемый результат
name | price
Desk lamp | 34.99
Chess set | 42
Headphones | 120.5
Задание

Выведи имя, фамилию и e-mail учеников, чья фамилия заканчивается на ov и у которых есть e-mail. Отсортируй по имени (first_name).

Задание · SQL
SELECT first_name, last_name, email
FROM students
-- add the two conditions
ORDER BY first_name;
▸ Ожидаемый результат
first_name | last_name | email
Kamran | Həsənov | kamran@example.com
Rəşad | Kərimov | rashad@example.com

Главное

  • LIKE ищет по шаблону: % — любое число символов, _ — ровно один.
  • IN (...) заменяет длинную цепочку OR, а NOT IN выбирает значения не из списка.
  • BETWEEN a AND b включает обе границы; меньшее значение пишут первым.
  • NULL означает «данных нет»; сравнение с ним даёт NULL.
  • Проверяй отсутствие значений через IS NULL / IS NOT NULL, а заменяй их с помощью COALESCE.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какой шаблон находит имена, начинающиеся с A?