Месяц — реальный срок для базового SQL. Не «знать теорию», а писать запросы которые решают реальные задачи. Вот конкретный план.
Что значит «выучить SQL»
Базовый уровень — это когда вы можете:
- Написать SELECT с фильтрацией, сортировкой и группировкой
- Объединить две-три таблицы через JOIN
- Ответить на аналитический вопрос: «сколько заказов по каждому пользователю за последний месяц»
Не нужно знать оконные функции, EXPLAIN или хранимые процедуры — это придёт позже.
Неделя 1: Основы SELECT
Цель: получать данные из одной таблицы.
Что изучить:
-- Выбрать все данные
SELECT * FROM users;
-- Выбрать конкретные колонки
SELECT name, email FROM users;
-- Фильтрация
SELECT name FROM users WHERE city = 'Москва';
SELECT name FROM users WHERE age >= 18 AND is_active = true;
SELECT name FROM users WHERE city IN ('Москва', 'СПб');
SELECT name FROM users WHERE name LIKE 'А%';
-- Сортировка и ограничение
SELECT name, created_at FROM users ORDER BY created_at DESC LIMIT 10;
Практика: 15–20 задач на SELECT и WHERE.
Неделя 2: Агрегаты и GROUP BY
Цель: считать, суммировать, группировать.
Что изучить:
-- Агрегатные функции
SELECT COUNT(*) FROM orders;
SELECT SUM(amount), AVG(amount), MAX(amount) FROM orders;
-- Группировка
SELECT city, COUNT(*) AS users_count
FROM users
GROUP BY city
ORDER BY users_count DESC;
-- Фильтрация групп
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
HAVING COUNT(*) > 100;
-- NULL
SELECT * FROM users WHERE phone IS NULL;
SELECT COALESCE(phone, 'не указан') FROM users;
Практика: 15–20 задач на GROUP BY.
Неделя 3: JOIN
Цель: объединять данные из нескольких таблиц.
Что изучить:
-- INNER JOIN: только совпадения
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- LEFT JOIN: все пользователи, даже без заказов
SELECT u.name, COUNT(o.id) AS orders_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
-- Несколько таблиц
SELECT u.name, p.name AS product, oi.quantity
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id;
Практика: 15–20 задач с JOIN.
JOIN — самая важная тема. Потратьте больше времени если нужно.
Неделя 4: Подзапросы и CTE
Цель: решать составные задачи.
Что изучить:
-- Подзапрос в WHERE
SELECT name FROM products
WHERE price > (SELECT AVG(price) FROM products);
-- CTE
WITH top_users AS (
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
ORDER BY total DESC
LIMIT 10
)
SELECT u.name, t.total
FROM top_users t
JOIN users u ON t.user_id = u.id;
Практика: 10–15 задач на подзапросы и CTE.
Как заниматься
30–60 минут в день. Регулярность важнее длинных сессий.
Не смотреть ответ сразу. Попытка решить задачу самостоятельно — это и есть обучение. Даже если занимает 10 минут и не получается.
Разбирать ошибки. ERROR: column "nme" does not exist — читайте внимательно, ошибка говорит что не так.
Повторять. В конце недели вернитесь к первым задачам. Решите быстрее — значит закрепилось.
Итог месяца
После 4 недель по 30–60 минут в день (≈ 30–60 часов практики) вы умеете:
- SELECT с любыми условиями и фильтрами
- GROUP BY и все агрегатные функции
- INNER JOIN и LEFT JOIN
- Простые подзапросы и CTE
Этого достаточно для стажёра-аналитика и большинства задач продакт-менеджера.
Следующий шаг — оконные функции: ROW_NUMBER, RANK, LAG/LEAD, SUM OVER.
Пройти этот план удобно на SQL Lab: структурированные курсы, задачи с автопроверкой, стрик и прогресс по темам — всё на русском языке с реальным PostgreSQL.