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

Разберём запрос по шагам:

  1. FROM users u — берём таблицу пользователей
  2. INNER JOIN orders o ON ... — присоединяем заказы по user_id
  3. GROUP BY u.name, u.city — группируем по пользователю
  4. COUNT(*), SUM(o.amount) — считаем количество и сумму заказов в каждой группе
  5. ORDER BY order_count DESC — сортируем от большего к меньшему
  6. LIMIT 3 — оставляем только топ-3

Это типичный запрос аналитика. На собеседованиях задают именно такие задачи — объединить таблицы, агрегировать, отсортировать.

Что дальше

Вы разобрали базу SQL: выборку, фильтрацию, сортировку, агрегацию и соединение таблиц. Этого хватит, чтобы начать решать простые задачи. Следующие шаги:


Потренируйтесь решать задачи — откройте тренажёр с 1500+ вопросами для подготовки к собеседованиям аналитиков.

SQL — это навык, который нарабатывается только практикой. Чем больше запросов напишете — тем увереннее будете на собеседовании.