- -
- 100%
- +

Перед первой задачей
Почему WHERE решает половину отчёта
Большинство ошибок в простых SQL-отчётах начинается не с JOIN и не с GROUP BY, а с неверного фильтра.
Один пропущенный набор скобок, неправильная граница BETWEEN или сравнение с NULL через равно могут тихо изменить весь результат.
Эта книга тренирует именно фильтры: маленькие таблицы, понятная цель, ожидаемый результат и объяснение, где строка вошла или не вошла в выборку.
Как работать с задачами
Перед запуском запроса попробуйте вручную отметить строки, которые должны пройти WHERE. Это лучший способ увидеть ошибку раньше движка.
Затем сравните свой список с ожидаемым результатом и обратите внимание на граничные значения: равно порогу, NULL, пустую строку и похожие статусы.
Все запросы рассчитаны на SQLite. Приёмы WHERE, IN, BETWEEN, LIKE, IS NULL, AND, OR и NOT полезны почти в любой SQL-системе.
Маршрут по задачам
1. Оставить только оплаченные заказы
2. Отобрать заказы в диапазоне суммы
3. Фильтровать заказы по дате
4. Найти товары по началу названия
5. Правильно проверить NULL
6. Использовать IN для набора статусов
7. Не забыть скобки вокруг OR
8. Исключить тестовые строки
9. Фильтровать по вычисленной сумме
10. Найти строки с непустым телефоном
11. Искать без учёта регистра
12. Отобрать активные товары с остатком
13. Фильтровать отрицанием
14. Найти подозрительно дешёвые продажи
15. Разделить входящие лиды по источникам
16. Проверить границы возраста
17. Поймать ошибку приоритета AND и OR
18. Собрать финальный фильтр каталога
Практические задачи
Задача 1. Оставить только оплаченные заказы
Рабочий вопросНужно показать заказы, которые уже оплачены, не смешивая их с новыми и отменёнными строками.
ДанныеCREATE TABLE orders(id INTEGER, status TEXT, total INTEGER);
INSERT INTO orders VALUES (1,'paid',500),(2,'new',700),(3,'cancelled',300),(4,'paid',900);
ЗапросSELECT id, status, total
FROM orders
WHERE status = 'paid'
ORDER BY id;
Ожидаемый результат[[1, "paid", 500], [4, "paid", 900]]
Почему работаетWHERE проверяет статус каждой строки.
В результат попадают только строки с точным значением paid.
new и cancelled не проходят условие и исчезают из выборки.
Где легко ошибитьсяНе переводите paid в русскую подпись до фильтра, если в базе хранится именно технический статус.
Самостоятельная проверкаДобавьте заказ со статусом Paid с большой буквы. Попадёт ли он в результат?
Ответ: Нет, потому что строковое сравнение здесь проверяет точное значение paid.
Задача 2. Отобрать заказы в диапазоне суммы
Рабочий вопросМенеджеру нужны заказы от 300 до 800 включительно, чтобы проверить средний чек.
ДанныеCREATE TABLE orders(id INTEGER, total INTEGER);
INSERT INTO orders VALUES (1,299),(2,300),(3,500),(4,800),(5,801);
ЗапросSELECT id, total
FROM orders
WHERE total BETWEEN 300 AND 800
ORDER BY id;
Ожидаемый результат[[2, 300], [3, 500], [4, 800]]
Почему работаетBETWEEN включает обе границы.
300 и 800 проходят условие.
299 ниже диапазона, а 801 выше диапазона.
Где легко ошибитьсяЕсли бизнес просит строго между 300 и 800, BETWEEN не подходит: нужны total > 300 и total < 800.
Самостоятельная проверкаПочему заказ на 800 попал в выборку, хотя это верхняя граница?
Ответ: Потому что BETWEEN в SQL включает нижнюю и верхнюю границы диапазона.
Задача 3. Фильтровать заказы по дате
Рабочий вопросНужно выбрать заказы за первую неделю сентября по датам в формате YYYY-MM-DD.
ДанныеCREATE TABLE orders(id INTEGER, order_date TEXT, total INTEGER);
INSERT INTO orders VALUES
(1,'2026-08-31',200),
(2,'2026-09-01',300),
(3,'2026-09-05',500),
(4,'2026-09-08',900);
ЗапросSELECT id, order_date, total
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.




