- Искать текст с помощью
LIKEи символов%и_ - Короче записывать условия с помощью
INиBETWEEN - Понимать, что такое
NULL, и пользоватьсяIS NULLиCOALESCE
Когда в поле поиска вводишь лишь часть фамилии, сайт всё равно находит нужного человека. А как найти «учеников из Сумгайыта, Губы или Нахчывана», «товары ценой от 10 до 55» или «учеников без e-mail»? Для этого в SQL есть четыре специальных оператора: LIKE, IN, BETWEEN и IS NULL.
LIKE: поиск по шаблону
LIKE сравнивает текст с шаблоном. В шаблоне есть два специальных символа: % заменяет любое количество символов (даже ноль), а _ — ровно один символ.
| Шаблон | Чему соответствует | Пример значения |
|---|---|---|
| 'A%' | начинается с A | Aysel |
| '%ova' | заканчивается на ova | Abbasova |
| '%set%' | содержит set | Chess set |
| '_u%' | вторая буква — u | Murad |
| '____' | ровно четыре символа | Quba |
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
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, наоборот, выбирает значения, которых в списке нет.
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
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 ничего не вернёт.
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
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: мы не знаем, равны ли два неизвестных значения. А WHERE оставляет только строки, для которых условие истинно.
SELECT NULL = NULL AS a,
NULL + 5 AS b,
5 > NULL AS c;▸ Ожидаемый результат
a | b | c NULL | NULL | NULL
-- wrong: the condition is never true
SELECT COUNT(*) AS found
FROM students
WHERE email = NULL;▸ Ожидаемый результат
found 0
COUNT(*) считает найденные строки. С = NULL ничего не находится, хотя у двух учеников нет e-mail.-- 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 работает везде.
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.
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. Отсортируй по возрастанию цены.
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).
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.