КПКейсПрактика
Все материалы
Продуктовая аналитикагайдстарт

SQL с нуля: как работают SELECT, FROM и WHERE

Разбираем первый SQL-запрос на понятном примере: как выбрать колонки, указать таблицу, отфильтровать строки и не перепутать результат с данными продукта.

КПКейсПрактика13 июля 2026 г.8 мин

Первый SQL-запрос лучше учить не на абстрактных цифрах, а на вопросе из реальной работы: “Покажи пользователей, которые пришли из organic в июне”. В нём уже есть всё необходимое — какие поля нужны, из какой таблицы их взять и какие строки оставить. Разберём эту логику на простом примере и закончим запросом, который можно выполнить в бесплатном тренажёре КейсПрактики.

Коротко

У базового запроса есть три главные детали: `SELECT` выбирает столбцы в результате, `FROM` указывает источник данных, а `WHERE` отбрасывает строки, которые не подходят под условие. Порядок написания всегда такой: сначала что показать, затем откуда взять, затем что оставить.

  • `SELECT` — какие поля или расчёты вернуть.
  • `FROM` — из какой таблицы или представления читать данные.
  • `WHERE` — какие строки подходят под вопрос.
  • Перед запросом нужно понять, что означает одна строка в таблице.
  • Для предсказуемой выборки добавляй `ORDER BY`, а для короткого примера — `LIMIT`.

Сначала разберись со структурой данных

Представим учебную таблицу `users`. В ней одна строка — один пользователь. Это важно зафиксировать до запроса: если одна строка уже описывает пользователя, можно читать список пользователей напрямую. В таблице `events` одна строка, наоборот, обычно означает одно событие, поэтому подсчёт строк там не равен подсчёту людей.

В тренажёре SQL можно открыть эту схему, посмотреть типы колонок и сразу проверить запросы на небольшом наборе данных. Такой цикл полезнее, чем запоминать синтаксис отдельно от смысла таблиц.

Учебная таблица users
КолонкаТипЧто означает
user_idintegerуникальный идентификатор пользователя
signup_datedateдата регистрации
channeltextканал привлечения: organic, paid или referral

SELECT: что показать в результате

`SELECT` задаёт форму результата. Если нужно проверить пользователей и их каналы, перечисли только эти поля. Явный список колонок помогает читать запрос и не тащит в ответ случайные технические поля.

Первые строки таблицы пользователей
select
  user_id,
  signup_date,
  channel
from users;
  • Не используй `select *` в итоговом отчёте: результат становится шире, а смысл — менее очевидным.
  • Порядок колонок в `SELECT` — это порядок колонок в ответе.
  • Вместо поля можно вернуть выражение или вычисляемое значение, но сначала закрепи базовую выборку.

FROM: откуда читать строки

`FROM users` говорит базе, что источником результата является таблица `users`. Если у таблицы есть короткий псевдоним, запрос становится удобнее расширять: `from users as u`, а колонку можно написать как `u.user_id`.

Название таблицы само по себе ещё ничего не гарантирует. Перед расчётом проверь, какая строка в ней хранится, за какой период загружены данные и нет ли отдельного представления для аналитики. Ошибка на этом шаге не исправляется красивым синтаксисом.

Проверка зерна

Спроси себя: если я возьму одну строку из users, она описывает пользователя, регистрацию, сессию или событие? Ответ определит, можно ли считать строки напрямую или понадобится distinct и агрегация.

WHERE: как оставить нужные строки

`WHERE` превращает общий список в ответ на конкретный вопрос. Например, так можно оставить только пользователей из organic, зарегистрированных начиная с 1 июня. Строковые значения пишутся в одинарных кавычках, а дату лучше сравнивать с датой, а не с произвольным текстом.

Пользователи из organic, зарегистрированные в июне
select
  user_id,
  signup_date,
  channel
from users
where channel = 'organic'
  and signup_date >= date '2026-06-01'
  and signup_date < date '2026-07-01';
  • `=` проверяет точное совпадение, например `channel = 'organic'`.
  • `and` требует, чтобы совпали оба условия.
  • `or` оставляет строку, если подходит хотя бы одно условие; группируй такие условия скобками.
  • Для диапазона дат обычно удобно использовать левую включённую и правую исключённую границу.

Собери запрос по шагам

Теперь объединим базовые части. Задача: посмотреть пять первых organic-пользователей, зарегистрированных в июне, в порядке даты регистрации. `ORDER BY` делает порядок явным, а `LIMIT` сокращает результат для быстрой проверки.

Читать его удобно сверху вниз как последовательность решений: какие поля вернуть → из какой таблицы → какие строки оставить → в каком порядке показать → сколько строк вывести. Логика выполнения внутри базы сложнее, но для аналитика такой порядок чтения хорошо сохраняет смысл запроса.

Полный запрос для первой проверки
select
  user_id,
  signup_date,
  channel
from users
where channel = 'organic'
  and signup_date >= date '2026-06-01'
  and signup_date < date '2026-07-01'
order by signup_date, user_id
limit 5;

Частые ошибки в первых запросах

На старте проблема обычно не в том, что запрос не запускается. Гораздо опаснее запрос, который запускается и даёт ответ не на тот вопрос.

Мини-проверка перед отправкой результата

Назови единицу строки, период, фильтры и ожидаемый размер ответа. Если не можешь объяснить эти четыре пункта словами, SQL ещё рано отправлять в дашборд.

  • Считать строки `events` как пользователей: одно и то же действие может повторяться много раз.
  • Писать `select *` и не замечать, что в отчёт попали технические поля или персональные данные.
  • Забывать кавычки вокруг текста: `organic` — значение, а не название колонки.
  • Использовать `limit` без `order by`, а потом считать полученную пятёрку “первыми” пользователями.
  • Сравнивать дату регистрации со строкой в непонятном формате и надеяться на неявное приведение типов.
  • Не проверять `null`: условие `channel = 'organic'` не включает пользователей с пустым каналом.

Мини-практика

Попробуй изменить последний запрос: оставь только пользователей из `paid`, выведи десять строк и отсортируй их по `user_id`. Затем замени диапазон дат на первые три дня июня. После этого можно переходить к агрегатам и считать, сколько пользователей пришло из каждого канала.

Что изучать дальше

После `SELECT`, `FROM` и `WHERE` логично перейти к `GROUP BY`, `COUNT` и `COUNT(DISTINCT)`. Именно там список строк превращается в метрику: DAU по дням, пользователи по каналам или конверсия между шагами воронки. Но сначала закрепи базовую механику на нескольких собственных вопросах.

Продолжить чтение
Вся библиотека