SQL с нуля: как работают SELECT, FROM и WHERE
Разбираем первый SQL-запрос на понятном примере: как выбрать колонки, указать таблицу, отфильтровать строки и не перепутать результат с данными продукта.
Первый SQL-запрос лучше учить не на абстрактных цифрах, а на вопросе из реальной работы: “Покажи пользователей, которые пришли из organic в июне”. В нём уже есть всё необходимое — какие поля нужны, из какой таблицы их взять и какие строки оставить. Разберём эту логику на простом примере и закончим запросом, который можно выполнить в бесплатном тренажёре КейсПрактики.
Коротко
У базового запроса есть три главные детали: `SELECT` выбирает столбцы в результате, `FROM` указывает источник данных, а `WHERE` отбрасывает строки, которые не подходят под условие. Порядок написания всегда такой: сначала что показать, затем откуда взять, затем что оставить.
- `SELECT` — какие поля или расчёты вернуть.
- `FROM` — из какой таблицы или представления читать данные.
- `WHERE` — какие строки подходят под вопрос.
- Перед запросом нужно понять, что означает одна строка в таблице.
- Для предсказуемой выборки добавляй `ORDER BY`, а для короткого примера — `LIMIT`.
Сначала разберись со структурой данных
Представим учебную таблицу `users`. В ней одна строка — один пользователь. Это важно зафиксировать до запроса: если одна строка уже описывает пользователя, можно читать список пользователей напрямую. В таблице `events` одна строка, наоборот, обычно означает одно событие, поэтому подсчёт строк там не равен подсчёту людей.
В тренажёре SQL можно открыть эту схему, посмотреть типы колонок и сразу проверить запросы на небольшом наборе данных. Такой цикл полезнее, чем запоминать синтаксис отдельно от смысла таблиц.
| Колонка | Тип | Что означает |
|---|---|---|
| user_id | integer | уникальный идентификатор пользователя |
| signup_date | date | дата регистрации |
| channel | text | канал привлечения: 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 июня. Строковые значения пишутся в одинарных кавычках, а дату лучше сравнивать с датой, а не с произвольным текстом.
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 по дням, пользователи по каналам или конверсия между шагами воронки. Но сначала закрепи базовую механику на нескольких собственных вопросах.
Материалы по теме
Оконные функции SQL: ROW_NUMBER, LAG и накопительный итог
Как работают оконные функции SQL на задачах аналитика: найти первое событие пользователя, сравнить день с предыдущим и посчитать накопительную выручку без потери строк.
Читать материалSQL JOIN для аналитика: как соединять users, events и payments
Понятное объяснение INNER JOIN и LEFT JOIN: как связать пользователей с событиями и платежами, не потерять сегменты и не завысить метрику после соединения.
Читать материалSQL GROUP BY и COUNT: как считать пользователей по каналам и дням
Разбираем GROUP BY, COUNT и COUNT DISTINCT на задачах аналитика: пользователи по каналам, DAU по дням и фильтрация агрегатов через HAVING.
Читать материал