SQL для начинающих — с чего начать
Что такое SQL
SQL (Structured Query Language) — язык, на котором вы разговариваете с базой данных. Представьте огромную таблицу в Excel на миллионы строк. Руками искать в ней нужные данные — безумие. SQL позволяет за секунду найти ровно то, что нужно: отфильтровать, отсортировать, посчитать, объединить данные из нескольких таблиц. Это главный рабочий инструмент аналитика данных — его спрашивают на каждом собеседовании, и без него на позицию аналитика просто не возьмут.
Таблицы, с которыми будем работать
Чтобы примеры были понятными, возьмём две простые таблицы.
users — пользователи:
| id | name | city |
|---|---|---|
| 1 | Анна | Москва |
| 2 | Борис | Казань |
| 3 | Вера | Москва |
| 4 | Глеб | Новосибирск |
orders — заказы:
| id | user_id | amount | created_at |
|---|---|---|---|
| 1 | 1 | 1500 | 2026-01-10 |
| 2 | 1 | 2300 | 2026-02-05 |
| 3 | 2 | 900 | 2026-01-20 |
| 4 | 3 | 4100 | 2026-03-01 |
| 5 | 3 | 1200 | 2026-03-15 |
| 6 | 3 | 3300 | 2026-04-01 |
У Анны два заказа, у Бориса один, у Веры три, а Глеб пока ничего не заказывал.
SELECT + FROM — первый запрос
Любой SQL-запрос начинается с двух слов: SELECT (что хотим получить) и FROM (откуда берём данные).
SELECT name, city
FROM users;Этот запрос вернёт имена и города всех пользователей. Если нужны все столбцы — используйте звёздочку:
SELECT *
FROM users;Звёздочка удобна для быстрого просмотра таблицы. Но в рабочих запросах лучше явно перечислять нужные столбцы — так запрос читается понятнее.
WHERE — фильтрация
Часто нужны не все строки, а только те, что подходят под условие. Для этого есть WHERE.
SELECT name, city
FROM users
WHERE city = 'Москва';Результат — только Анна и Вера. WHERE поддерживает стандартные операторы сравнения: =, !=, >, <, >=, <=. Условия можно комбинировать через AND и OR:
SELECT *
FROM orders
WHERE amount > 1000
AND created_at >= '2026-03-01';Этот запрос вернёт заказы на сумму больше 1000, сделанные с марта 2026 года.
ORDER BY и LIMIT — сортировка и ограничение
ORDER BY сортирует результат, LIMIT ограничивает количество строк.
SELECT *
FROM orders
ORDER BY amount DESC
LIMIT 3;DESC — от большего к меньшему (descending). По умолчанию сортировка идёт по возрастанию (ASC). Этот запрос вернёт три самых крупных заказа.
LIMIT особенно полезен, когда в таблице миллионы строк, а вам нужно быстро посмотреть, как данные выглядят.
Агрегатные функции — COUNT, SUM, AVG
Агрегатные функции считают что-то по набору строк и возвращают одно значение.
- COUNT(*) — количество строк
- SUM(column) — сумма значений
- AVG(column) — среднее значение
- MIN(column) / MAX(column) — минимум и максимум
SELECT
COUNT(*) AS total_orders,
SUM(amount) AS total_revenue,
AVG(amount) AS avg_order
FROM orders;Результат: 6 заказов, общая выручка 13 300, средний чек ~2 217. Ключевое слово AS задаёт псевдоним столбцу — чтобы в результате было понятное название, а не count(*).
GROUP BY — агрегация по группам
А если нужно посчитать не по всей таблице, а отдельно для каждого пользователя? Тут нужен GROUP BY.
SELECT
user_id,
COUNT(*) AS order_count,
SUM(amount) AS total_spent
FROM orders
GROUP BY user_id;Результат:
| user_id | order_count | total_spent |
|---|---|---|
| 1 | 2 | 3800 |
| 2 | 1 | 900 |
| 3 | 3 | 8600 |
GROUP BY разбивает строки на группы по указанному столбцу и применяет агрегатные функции внутри каждой группы. Правило простое: всё, что в SELECT и не обёрнуто в агрегатную функцию, должно быть в GROUP BY.
JOIN — объединение таблиц
Данные в базах разнесены по разным таблицам. В таблице orders есть user_id, но нет имени пользователя. Чтобы получить имя, нужно соединить orders с users. Для этого есть JOIN.
INNER JOIN
Возвращает только те строки, для которых есть совпадение в обеих таблицах.
SELECT u.name, o.amount, o.created_at
FROM orders o
INNER JOIN users u ON o.user_id = u.id;Глеб в результат не попадёт — у него нет заказов, поэтому совпадения нет.
LEFT JOIN
Возвращает все строки из левой таблицы (той, что в FROM). Если совпадения в правой таблице нет — подставляются NULL.
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;Теперь Глеб в результате есть, но с amount = NULL. LEFT JOIN нужен, когда важно не потерять строки из основной таблицы — например, чтобы увидеть пользователей без заказов.
Подробнее о разнице между типами JOIN — в шпаргалке по JOIN.
Собираем всё вместе
Задача: найти топ-3 пользователей по количеству заказов. Показать имя, город, число заказов и общую сумму.
SELECT
u.name,
u.city,
COUNT(*) AS order_count,
SUM(o.amount) AS total_spent
FROM users u
INNER JOIN orders o ON u.id = o.user_id
GROUP BY u.name, u.city
ORDER BY order_count DESC
LIMIT 3;Результат:
| name | city | order_count | total_spent |
|---|---|---|---|
| Вера | Москва | 3 | 8600 |
| Анна | Москва | 2 | 3800 |
| Борис | Казань | 1 | 900 |
Разберём запрос по шагам:
- FROM users u — берём таблицу пользователей
- INNER JOIN orders o ON ... — присоединяем заказы по
user_id - GROUP BY u.name, u.city — группируем по пользователю
- COUNT(*), SUM(o.amount) — считаем количество и сумму заказов в каждой группе
- ORDER BY order_count DESC — сортируем от большего к меньшему
- LIMIT 3 — оставляем только топ-3
Это типичный запрос аналитика. На собеседованиях задают именно такие задачи — объединить таблицы, агрегировать, отсортировать.
Что дальше
Вы разобрали базу SQL: выборку, фильтрацию, сортировку, агрегацию и соединение таблиц. Этого хватит, чтобы начать решать простые задачи. Следующие шаги:
- Практика на реальных задачах — теорию без практики легко забыть. В SQL-тренажёре Карьерника можно решать задачи с собеседований прямо в Telegram
- SQL для аналитика данных — какие темы нужно знать на уровне джуна, мидла и сеньора
- Оконные функции — следующий уровень после GROUP BY. ROW_NUMBER, RANK, LAG, LEAD — без них не обходится ни одно собеседование на мидла
- 1500+ примеров вопросов — вопросы, которые реально задают на собеседованиях
Потренируйтесь решать задачи — откройте тренажёр с 1500+ вопросами для подготовки к собеседованиям аналитиков.
SQL — это навык, который нарабатывается только практикой. Чем больше запросов напишете — тем увереннее будете на собеседовании.