SQL можно выучить за 3 месяца при регулярной практике. Не «знать синтаксис», а писать запросы уверенно — как инструмент, а не как экзаменационный материал.
Месяц 1: Основы
Неделя 1–2: SELECT и фильтрация
-- Это ваш первый месяц в одном запросе:
SELECT name, email, created_at
FROM users
WHERE created_at >= '2024-01-01'
AND is_active = true
ORDER BY created_at DESC
LIMIT 10;
Что нужно освоить:
- SELECT конкретных колонок и
* - WHERE с условиями (=, !=, >, <, BETWEEN, IN, LIKE)
- AND, OR, NOT
- ORDER BY (ASC/DESC)
- LIMIT и OFFSET
Неделя 3–4: Агрегаты и GROUP BY
SELECT
department,
COUNT(*) AS employees,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary
FROM employees
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY avg_salary DESC;
Что нужно освоить:
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY: зачем и как работает
- HAVING: отличие от WHERE
- NULL: IS NULL, COALESCE
Месяц 2: Объединения и вложенные запросы
Неделя 1–2: JOIN
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;
Освойте: INNER JOIN, LEFT JOIN, RIGHT JOIN, разницу между ними.
Неделя 3–4: Подзапросы и CTE
-- Подзапрос в WHERE
SELECT name FROM products
WHERE price > (SELECT AVG(price) FROM products);
-- CTE — то же самое, но читаемее
WITH avg_price AS (
SELECT AVG(price) AS val FROM products
)
SELECT name FROM products, avg_price
WHERE products.price > avg_price.val;
Месяц 3: Продвинутый уровень
Оконные функции
SELECT
name,
salary,
department,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank,
AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;
Оконные функции — ключевая тема для аналитических ролей. ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, SUM OVER.
Производительность
- EXPLAIN ANALYZE — как читать план запроса
- Индексы — когда они помогают
- Частые антипаттерны: SELECT *, функции в WHERE, SELECT DISTINCT без причины
Частые ошибки при обучении
Читать вместо писать. Посмотрел запрос — понял, кажется. Попробовал написать — не выходит. Пишите каждый пример сами.
Прыгать между темами. Не идите к оконным функциям пока не освоили JOIN. Темы строятся на предыдущих.
Не разбирать ошибки. Ошибка PostgreSQL — это подсказка, не приговор. Читайте сообщения внимательно.
Большие перерывы. 3 дня без практики — и нужно вспоминать с нуля. Лучше 15 минут ежедневно.
Когда вы готовы к работе
Аналитику достаточно:
- Уверенный SELECT с JOIN и GROUP BY
- Подзапросы и CTE
- Базовые оконные функции
- Умение читать и писать запросы без подсказок
Разработчику нужно добавить:
- DDL (CREATE TABLE, ALTER, DROP)
- DML (INSERT, UPDATE, DELETE)
- Транзакции и ACID
- Индексы и оптимизация
3 месяца — реалистичный срок при 30–60 минутах практики в день.
Для практики по этому плану подойдёт SQL Lab — русскоязычный тренажёр с курсами по всем перечисленным темам, задачами с автопроверкой и ежедневными задачами для поддержания стрика.