Урок 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

Порядок частей запроса жёсткий! Меняешь местами — получишь синтаксическую ошибку:

  1. SELECT — какие колонки
  2. FROM — из какой таблицы
  3. WHERE — какие строки
  4. ORDER BY — как сортировать
  5. 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 + квиз ниже. Удачи!