Урок 1.3. Фильтрация данных: WHERE, операторы сравнения и сортировка
Модуль 1. Введение в базы данных
Урок 1.3
Длительность 25 минут
Сложность ⭐⭐ Базовый
Самый важный урок Модуля 1
До сих пор мы возвращали все строки таблицы. Это работает только на учебной базе из 80 товаров. В реальной жизни таблицы содержат миллионы записей, и нужно уметь точно отбирать именно те строки, что вам нужны.
Сегодня мы освоим WHERE — главный инструмент фильтрации в SQL. К концу урока вы сможете отвечать на вопросы вроде: «покажи товары дороже 500 сом», «найди клиентов из Оша, зарегистрированных в 2024 году», «дай список товаров, в названии которых есть слово „масло“».
Если бы вас взяли на работу аналитиком в сеть «Народный» завтра — 90% ваших задач строились бы вокруг WHERE. Это самый часто используемый оператор в SQL после SELECT.
Структура запроса с WHERE
SELECT <колонки>
FROM <таблица>
WHERE <условие>;
Условие в WHERE — это утверждение, которое для каждой строки либо истинно (TRUE), либо ложно (FALSE). База возвращает только те строки, для которых условие истинно.
Операторы сравнения
Самые базовые операторы — числовое сравнение:
| Оператор | Значение | Пример |
|---|---|---|
= |
равно | price = 100 |
<> или != |
не равно | city <> 'Бишкек' |
> |
больше | price > 500 |
< |
меньше | price < 50 |
>= |
больше или равно | price >= 500 |
<= |
меньше или равно | price <= 50 |
Пример — все товары дороже 500 сом:
SELECT name, price
FROM products
WHERE price > 500;
Текстовые значения — всегда в одинарных кавычках!WHERE city = 'Бишкек', а не WHERE city = Бишкек. Двойные кавычки в SQL обычно используются для имён колонок, а одинарные — для строковых значений.
Логические операторы: AND, OR, NOT
Часто условие сложнее одного сравнения. Тогда соединяйте через AND (и), OR (или), NOT (не):
-- Товары из категории 5 (фрукты/овощи) дороже 100 сом
SELECT name, price
FROM products
WHERE category_id = 5 AND price > 100;
-- Магазины в Бишкеке ИЛИ в Оше
SELECT name, city
FROM stores
WHERE city = 'Бишкек' OR city = 'Ош';
Приоритет операторов
AND имеет более высокий приоритет, чем OR. То есть в выражении A OR B AND C сначала вычисляется B AND C, потом результат через OR. Это часто приводит к ошибкам! Используйте скобки для ясности:
-- Опасно: что вычислится первым?
WHERE city = 'Бишкек' OR city = 'Ош' AND price > 500
-- Однозначно: товары дороже 500 в Бишкеке или в Оше
WHERE (city = 'Бишкек' OR city = 'Ош') AND price > 500
Правило: когда в условии больше одного логического оператора — всегда ставьте скобки. Это спасло аналитиков от тысяч багов.
BETWEEN — диапазоны
Часто нужно выбрать значения в диапазоне — товары от 100 до 500 сом, продажи за апрель и т.д. Можно через AND:
WHERE price >= 100 AND price <= 500
А можно короче, через BETWEEN:
SELECT name, price
FROM products
WHERE price BETWEEN 100 AND 500;
BETWEEN включает обе границы (100 и 500 попадут в результат). Удобно с датами:
-- Все продажи в апреле 2025
SELECT *
FROM sales
WHERE sale_date BETWEEN '2025-04-01' AND '2025-04-30';
IN — список значений
Когда нужно проверить, что значение равно одному из нескольких вариантов:
-- Через OR
WHERE city = 'Бишкек' OR city = 'Ош' OR city = 'Каракол'
-- Можно через IN
WHERE city IN ('Бишкек', 'Ош', 'Каракол')
IN выглядит понятнее и проще читается. Полный пример:
SELECT name, city
FROM stores
WHERE city IN ('Бишкек', 'Ош', 'Каракол');
Есть и обратная форма — NOT IN:
-- Магазины НЕ в столичных городах
SELECT name, city
FROM stores
WHERE city NOT IN ('Бишкек', 'Ош');
LIKE — поиск по тексту
Что если нужно найти все товары, в названии которых есть слово «масло»? Точное равенство не подходит — название может быть «Масло подсолнечное 1л» или «Масло сливочное 200г». Здесь нужен оператор LIKE с шаблоном.
В шаблоне используются два специальных символа:
| Символ | Значение | Пример | Совпадает с |
|---|---|---|---|
% |
любое количество любых символов (в т.ч. ноль) | '%масло%' |
«Масло подсолнечное», «Сливочное масло 200г» |
_ |
ровно один любой символ | '_ом' |
«том», «дом», но не «атом» |
Примеры:
-- Все товары со словом "масло" где-то в названии
SELECT name, price
FROM products
WHERE name LIKE '%масло%';
-- Товары, начинающиеся со слова "Молоко"
SELECT name FROM products WHERE name LIKE 'Молоко%';
-- Товары, заканчивающиеся на "1кг"
SELECT name FROM products WHERE name LIKE '%1кг';
SQLite чувствителен к регистру в LIKE по умолчанию!LIKE '%масло%' и LIKE '%Масло%' вернут разные результаты. Чтобы это обойти, можно использовать функцию LOWER():
WHERE LOWER(name) LIKE '%масло%'
Эта тема глубже раскроется в Модуле 3, пока запомните как факт.
Работа с NULL — отсутствующими значениями
В реальных данных часто встречаются пропуски. В нашей базе у части клиентов не указан телефон или город. В SQL это обозначается специальным значением NULL — «нет данных», «неизвестно».
Важно понять: NULL — это не пустая строка '' и не ноль 0. Это отсутствие значения. Из-за этого правила сравнения с NULL особые:
WHERE phone = NULL— НЕ работает! Возвращает 0 строкWHERE phone <> NULL— тоже НЕ работает
Используйте специальные операторы:
-- Клиенты без телефона
SELECT first_name, last_name
FROM customers
WHERE phone IS NULL;
-- Клиенты С телефоном
SELECT first_name, last_name, phone
FROM customers
WHERE phone IS NOT NULL;
Кейс «Народный»: отдел маркетинга планирует SMS-рассылку с акциями. Естественно, отправлять её можно только тем клиентам, у кого телефон указан. Запрос WHERE phone IS NOT NULL отфильтрует таких клиентов из 200 — обычно это 80–85% базы.
ORDER BY — сортировка результата
По умолчанию строки в результате идут в произвольном порядке (на самом деле — в физическом порядке хранения, но для нас это «случайно»). Чтобы упорядочить результат, добавьте ORDER BY:
-- Товары от самых дешёвых к самым дорогим
SELECT name, price
FROM products
ORDER BY price; -- по умолчанию ASC (по возрастанию)
-- Товары от самых дорогих к самым дешёвым
SELECT name, price
FROM products
ORDER BY price DESC; -- DESC = descending = по убыванию
Сортировка по нескольким столбцам
Можно сортировать по нескольким столбцам сразу — сначала по первому, при равенстве — по второму:
-- Магазины по городу (по алфавиту), внутри города — по дате открытия
SELECT city, name, opened_date
FROM stores
ORDER BY city ASC, opened_date DESC;
Собираем всё вместе
Реальный аналитический запрос — типичный пример:
-- Топ-10 самых дорогих товаров категории "Мясо и птица" в наличии
SELECT
name AS "Товар",
price AS "Цена, сом"
FROM products
WHERE category_id = 3 -- категория "Мясо и птица"
AND in_stock = 1 -- товар в наличии
ORDER BY price DESC -- от самого дорогого
LIMIT 10; -- только 10
Порядок частей запроса жёсткий! Меняешь местами — получишь синтаксическую ошибку:
SELECT— какие колонкиFROM— из какой таблицыWHERE— какие строкиORDER BY— как сортироватьLIMIT— сколько вернуть
Запомните: SELECT-FROM-WHERE-ORDER BY-LIMIT.
Резюме урока
| Конструкция | Что делает |
|---|---|
WHERE условие |
Фильтрация строк |
=, <>, >, <, >=, <= |
Сравнения |
AND, OR, NOT |
Логические операторы (используйте скобки!) |
BETWEEN A AND B |
Диапазон (включительно) |
IN (...) |
Список значений |
LIKE '%шаблон%' |
Поиск по тексту |
IS NULL / IS NOT NULL |
Проверка на пропуск |
ORDER BY col [DESC] |
Сортировка |
Что дальше
Поздравляю — вы закончили Модуль 1! Вы умеете:
- Работать с DB Browser и базой данных
- Писать запросы SELECT с конкретными колонками
- Использовать LIMIT, DISTINCT, AS
- Фильтровать данные через WHERE с любыми операторами
- Сортировать результат через ORDER BY
Этого уже достаточно, чтобы выполнить ~50% задач на собеседовании Junior Data Analyst в Бишкеке. Дальше — больше: в Модуле 2 мы научимся объединять несколько таблиц через JOIN и работать с реальными многотабличными запросами.
🎯 Финальные задания Модуля 1 + квиз ниже. Удачи!
