Что такое SQL и зачем он нужен в 2026 году

SQL (Structured Query Language) — это язык структурированных запросов, который позволяет общаться с базами данных. С его помощью вы можете извлекать информацию, изменять её, анализировать и управлять данными в реляционных СУБД. SQL был создан в 1970-х годах, но остаётся актуальным и в 2026 году.

Любая современная компания работает с данными: о клиентах, продажах, товарах, транзакциях. Эти данные хранятся в базах, а SQL — инструмент для работы с ними. Без SQL невозможно получить ответы на бизнес-вопросы: сколько пользователей зарегистрировалось за месяц, какой товар приносит максимальную прибыль, какие клиенты совершили повторную покупку.

В 2026 году SQL — это универсальный навык для специалистов из разных сфер:

  • Аналитики данных используют SQL для сегментации клиентов, расчёта метрик, построения витрин данных
  • Продуктовые менеджеры применяют запросы для анализа поведения пользователей и A/B-тестирования
  • Маркетологи выгружают данные для оценки эффективности кампаний
  • Разработчики проектируют базы данных и оптимизируют запросы
  • Владельцы бизнеса получают актуальную отчётность без помощи техспециалистов

SQL не требует глубоких знаний программирования. Синтаксис читается почти как естественный язык: SELECT (выбрать), WHERE (где), FROM (из). Это делает его доступным для начинающих, которые могут освоить базовые запросы за несколько недель.

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

Статистика и карьерные перспективы

SQL в 2026 году — универсальный инструмент для работы с данными, который требуется в большинстве вакансий, связанных с анализом и работой с информацией. Аналитики данных востребованы во всех сферах, и медианный ежемесячный доход аналитиков данных — 130 000 рублей.

Рассмотрим конкретные цифры по зарплатам специалистов со знанием SQL в России в 2026 году:

  • Junior-аналитик данных: от 60 000 до 80 000 рублей в месяц
  • Middle-аналитик данных: от 139 000 до 180 000 рублей в месяц
  • Senior-аналитик данных: от 250 000 до 350 000 рублей в месяц

Аналитик по данным зарабатывает 163 500 рублей в среднем по России, согласно данным Хабр Карьеры. Зарплаты аналитиков в России выросли на 7% в первой половине 2024 года, и в среднем доход специалиста составляет 160 000 рублей.

Для SQL-разработчиков цифры несколько выше. Средняя зарплата по должности разработчик SQL в России за 2026 год — 153 000 рублей, чаще всего зарплаты находятся в диапазоне от 113 000 до 192 000 рублей.

По специализациям картина выглядит следующим образом:

  • Бизнес-аналитик: средняя зарплата 168 000 рублей (Junior от 60 000, Middle от 139 000, Senior от 250 000 рублей)
  • Системный аналитик: медианная зарплата 203 000–225 000 рублей (Junior от 80 000, Middle от 180 000, Senior до 350 000 рублей)
  • Data Scientist: в среднем 211 666 рублей в месяц

Переход Junior → Middle занимает 1–2 года опыта в data analysis and reporting. Это означает, что при систематическом обучении и практике вы можете выйти на доход от 140 000 рублей уже через год-полтора работы.

Пример: Дмитрий прошёл курс SQL, собрал портфолио из трёх учебных проектов и устроился junior-аналитиком в e-commerce компанию с зарплатой 75 000 рублей. Через 14 месяцев, освоив оконные функции и A/B-тестирование, он перешёл на позицию middle-аналитика с окладом 165 000 рублей.

Основы баз данных: реляционные БД, таблицы, строки, столбцы

База данных (БД) — это организованное хранилище информации, которое позволяет быстро находить, добавлять, изменять и удалять данные. Реляционные базы данных — самый распространённый тип БД, где информация структурирована в виде таблиц.

Таблица — это основная структура данных, похожая на электронную таблицу Excel. Каждая таблица имеет название и содержит данные об определённой сущности: клиенты, заказы, товары, транзакции.

Таблица состоит из:

  • Столбцов (полей) — вертикальных элементов, которые определяют тип данных. Например, в таблице «Клиенты» могут быть столбцы: id, имя, email, дата_регистрации
  • Строк (записей) — горизонтальных элементов, каждая строка представляет отдельный объект. Например, одна строка = один клиент

Рассмотрим пример таблицы Пользователи:

id имя email город дата_регистрации
1 Анна anna@mail.ru Москва 2026-01-15
2 Сергей sergey@gmail.com Санкт-Петербург 2026-02-10
3 Мария maria@yandex.ru Казань 2026-03-01

В реляционных БД таблицы связаны между собой через ключи:

  • Первичный ключ (PRIMARY KEY) — уникальный идентификатор каждой строки, обычно это поле id
  • Внешний ключ (FOREIGN KEY) — поле, которое ссылается на первичный ключ другой таблицы и создаёт связь между ними

Например, таблица «Заказы» может содержать поле user_id, которое ссылается на id в таблице «Пользователи». Это позволяет узнать, какой пользователь сделал конкретный заказ.

СУБД (Система Управления Базами Данных) — это программное обеспечение для работы с БД. Именно СУБД обрабатывает ваши SQL-запросы и выполняет операции с данными: PostgreSQL, MySQL, MS SQL Server, Oracle — всё это разные СУБД.

Принципы работы с реляционными БД:

  • Данные не дублируются — каждая информация хранится в одном месте
  • Связи между таблицами позволяют объединять данные из разных источников
  • Целостность данных обеспечивается через ограничения и ключи
  • SQL позволяет получать нужные данные одним запросом, даже если они распределены по нескольким таблицам

Выбор СУБД: PostgreSQL vs MySQL vs MS SQL vs Oracle

Выбор СУБД зависит от задач, размера проекта и инфраструктуры компании. В 2026 году наиболее популярны четыре системы, каждая со своими сильными сторонами.

PostgreSQL — объектно-реляционная СУБД с открытым исходным кодом. PostgreSQL ranked as the most widely used database among professional developers, overtaking MySQL for the first time, и 65% разработчиков указали предпочтение PostgreSQL для новых проектов.

Преимущества PostgreSQL:

  • Полностью бесплатная, лицензия MIT/BSD без ограничений
  • Мощная поддержка JSON, массивов, диапазонов типов
  • Продвинутые функции: оконные функции, CTE, full-text search
  • Расширяемость через плагины (PostGIS для геоданных, pgvector для AI)
  • Отличная производительность на сложных запросах с JOIN и подзапросами
  • Активное сообщество и прозрачное развитие

Используется: в продуктовой аналитике, стартапах, SaaS-платформах, научных проектах. Популярен у разработчиков Python, JavaScript, Ruby.

MySQL — самая распространённая открытая СУБД, принадлежащая Oracle. MySQL — это самая распространённая Relational Database Management System в мире, и в 2026 году она имеет вторую по величине популярность среди разработчиков.

Преимущества MySQL:

  • Простота установки и настройки
  • Высокая скорость на простых запросах и операциях чтения
  • Встроена в популярный стек LAMP (Linux, Apache, MySQL, PHP)
  • Отличная документация и большое сообщество
  • Стабильность при регулярном обслуживании БД

Используется: в WordPress, e-commerce (Shopify), веб-приложениях на PHP, системах с высокой нагрузкой на запись.

MS SQL Server — коммерческая СУБД от Microsoft для корпоративного сегмента.

Преимущества MS SQL Server:

  • Глубокая интеграция с экосистемой Microsoft (.NET, Azure, Power BI)
  • Мощные инструменты администрирования и мониторинга
  • Встроенные средства аналитики и отчётности
  • Профессиональная техподдержка от Microsoft
  • Высокий уровень безопасности и соответствия стандартам

Используется: в крупных корпорациях, банках, госучреждениях, ERP-системах (1C, SAP).

Oracle Database — флагманская коммерческая СУБД для энтерпрайз-сегмента.

Преимущества Oracle:

  • Максимальная производительность на огромных объёмах данных
  • Продвинутые функции партиционирования и кластеризации
  • Высокая надёжность и отказоустойчивость
  • Комплексная техподдержка уровня enterprise

Используется: в банковском секторе, телекоммуникациях, крупных производственных компаниях.

Совет: Новичкам рекомендуется начинать с PostgreSQL — она бесплатная, содержит все современные функции SQL и имеет лучшую совместимость со стандартами языка. Если вы планируете работать в корпоративной среде, изучите также MS SQL Server.
СУБД Лицензия Сложность Лучше всего для
PostgreSQL Бесплатно Средняя Аналитика, новые проекты, стартапы
MySQL Бесплатно Низкая Веб-приложения, WordPress, PHP-проекты
MS SQL Server Платно Средняя Корпоративная отчётность, Microsoft-среда
Oracle Платно Высокая Банки, энтерпрайз, большие данные

Подходящие курсы по теме

Инструменты для работы: DBeaver, PhpMyAdmin, облачные решения

Для написания SQL-запросов и работы с базами данных вам понадобится специальный инструмент — клиент СУБД или IDE (интегрированная среда разработки). В 2026 году есть как бесплатные универсальные решения, так и специализированные инструменты.

DBeaver — бесплатный кроссплатформенный инструмент для работы с любыми СУБД (PostgreSQL, MySQL, MS SQL, Oracle, SQLite и другие).

Преимущества DBeaver:

  • Поддержка всех популярных баз данных в одном интерфейсе
  • Визуальный редактор запросов с подсветкой синтаксиса
  • Автодополнение названий таблиц и полей
  • Просмотр структуры БД в виде дерева
  • Экспорт результатов в CSV, Excel, JSON
  • Бесплатная Community-версия для большинства задач

Идеально подходит для начинающих и аналитиков данных, которым нужно работать с несколькими типами баз одновременно.

PhpMyAdmin — веб-интерфейс для управления MySQL и MariaDB.

Преимущества PhpMyAdmin:

  • Работает через браузер, не требует установки на компьютер
  • Удобен для быстрых операций с БД на хостинге
  • Визуальное создание и редактирование таблиц
  • Интеграция с большинством веб-хостингов

Используется в основном веб-разработчиками для управления MySQL на серверах.

pgAdmin — официальный графический клиент для PostgreSQL.

Преимущества pgAdmin:

  • Полная поддержка всех возможностей PostgreSQL
  • Визуальный конструктор запросов
  • Инструменты мониторинга производительности
  • Управление пользователями и правами доступа

Облачные решения — платформы с готовыми базами данных и встроенными редакторами:

  • Google BigQuery — аналитическая БД от Google для работы с большими данными, запросы пишутся на SQL-диалекте
  • AWS RDS — управляемые базы данных PostgreSQL, MySQL, MS SQL в облаке Amazon
  • Supabase — open-source платформа на базе PostgreSQL с веб-интерфейсом и API
  • PlanetScale — serverless MySQL с Git-подобным управлением версиями

Metabase — open-source BI-инструмент с SQL-редактором и визуализацией данных.

Преимущества Metabase:

  • Позволяет писать SQL-запросы и сразу строить графики
  • Создание дашбордов без программирования
  • Подключение к PostgreSQL, MySQL, BigQuery, ClickHouse
  • Удобен для аналитиков, которым нужна визуализация

Для начинающих оптимальный выбор — DBeaver для локальной работы или встроенные редакторы на платформах для практики (Stepik, SQL Academy). Эти инструменты бесплатны и не требуют сложной настройки.

ТОП-10 SQL запросов для начинающих с примерами кода

Освоение SQL начинается с базовых конструкций, которые покрывают 80% повседневных задач аналитика. Ниже — десять ключевых типов запросов с практическими примерами на основе таблицы Заказы.

Структура таблицы для примеров:

id user_id товар цена количество дата_заказа
1 101 Ноутбук 65000 1 2026-03-01
2 102 Мышь 1500 2 2026-03-05
3 101 Клавиатура 3500 1 2026-03-10

1. SELECT — выборка всех данных

SELECT * FROM заказы;

Возвращает все строки и столбцы из таблицы.

2. SELECT с указанием столбцов

SELECT товар, цена, дата_заказа FROM заказы;

Выбирает только нужные поля, игнорируя остальные.

3. WHERE — фильтрация по условию

SELECT * FROM заказы WHERE цена > 5000;

Показывает только заказы дороже 5 000 рублей.

4. ORDER BY — сортировка результатов

SELECT * FROM заказы ORDER BY цена DESC;

Сортирует заказы по убыванию цены (самые дорогие сверху).

5. LIMIT — ограничение количества строк

SELECT * FROM заказы ORDER BY дата_заказа DESC LIMIT 5;

Возвращает пять последних заказов.

6. COUNT — подсчёт количества записей

SELECT COUNT(*) FROM заказы WHERE дата_заказа >= '2026-03-01';

Считает, сколько заказов было сделано с 1 марта.

7. SUM — суммирование значений

SELECT SUM(цена * количество) AS общая_выручка FROM заказы;

Рассчитывает общую выручку по всем заказам.

8. GROUP BY — группировка данных

SELECT user_id, COUNT(*) AS количество_заказов 
FROM заказы 
GROUP BY user_id;

Показывает, сколько заказов сделал каждый пользователь.

9. HAVING — фильтрация после группировки

SELECT user_id, SUM(цена * количество) AS сумма_покупок 
FROM заказы 
GROUP BY user_id 
HAVING сумма_покупок > 10000;

Находит пользователей, которые потратили более 10 000 рублей.

10. DISTINCT — уникальные значения

SELECT DISTINCT товар FROM заказы;

Возвращает список уникальных товаров без дубликатов.

Эти десять конструкций — фундамент SQL. Комбинируя их, вы сможете решать большинство аналитических задач: формировать отчёты, считать метрики, сегментировать пользователей, находить аномалии в данных.

SELECT: выборка данных из таблиц

SELECT — самая частая команда в SQL, с которой начинается любой запрос на извлечение данных. Синтаксис читается интуитивно: «выбери (SELECT) определённые поля из (FROM) конкретной таблицы».

Базовый синтаксис:

SELECT столбец1, столбец2, столбец3 
FROM название_таблицы;

Пример: выбрать имена и email из таблицы пользователи:

SELECT имя, email FROM пользователи;

Выборка всех столбцов:

SELECT * FROM пользователи;

Символ * означает «все столбцы». Это удобно для быстрого просмотра данных, но в продакшене лучше указывать конкретные поля — так запрос работает быстрее.

Переименование столбцов с помощью AS:

SELECT 
  имя AS "Имя пользователя",
  email AS "Электронная почта",
  дата_регистрации AS "Дата регистрации"
FROM пользователи;

Алиасы (псевдонимы) делают результаты понятнее, особенно при построении отчётов.

Вычисления в SELECT:

SELECT 
  товар,
  цена,
  количество,
  цена * количество AS итоговая_стоимость
FROM заказы;

SQL позволяет выполнять математические операции прямо в запросе: сложение, вычитание, умножение, деление.

Константы и строковые литералы:

SELECT 
  'Пользователь' AS тип,
  имя,
  город
FROM пользователи;

Можно добавлять фиксированные значения в результат — это полезно при объединении данных из нескольких таблиц.

Функции в SELECT:

SELECT 
  UPPER(имя) AS имя_заглавными,
  LENGTH(email) AS длина_email,
  CURRENT_DATE AS сегодня
FROM пользователи;

SQL содержит десятки встроенных функций для работы со строками, датами, числами. UPPER переводит текст в верхний регистр, LENGTH возвращает длину строки, CURRENT_DATE — текущую дату.

SELECT — это точка входа в работу с данными. Освоив её вариации, вы сможете формировать отчёты любой сложности.

WHERE: фильтрация данных

WHERE добавляет условия к запросу, позволяя отобрать только нужные строки. Без WHERE вы получаете все записи из таблицы, с WHERE — только те, что соответствуют критериям.

Базовый синтаксис:

SELECT столбцы FROM таблица WHERE условие;

Операторы сравнения:

-- Точное совпадение
SELECT * FROM заказы WHERE город = 'Москва';

-- Больше, меньше
SELECT * FROM заказы WHERE цена > 10000;
SELECT * FROM заказы WHERE количество <= 5;

-- Не равно
SELECT * FROM пользователи WHERE статус != 'активный';

Логические операторы AND, OR, NOT:

-- AND: оба условия должны быть истинны
SELECT * FROM заказы 
WHERE город = 'Москва' AND цена > 5000;

-- OR: хотя бы одно условие истинно
SELECT * FROM заказы 
WHERE город = 'Москва' OR город = 'Санкт-Петербург';

-- NOT: инверсия условия
SELECT * FROM пользователи 
WHERE NOT город = 'Москва';

BETWEEN — диапазон значений:

SELECT * FROM заказы 
WHERE цена BETWEEN 5000 AND 15000;

Эквивалентно цена >= 5000 AND цена <= 15000.

IN — проверка вхождения в список:

SELECT * FROM заказы 
WHERE город IN ('Москва', 'Санкт-Петербург', 'Казань');

Вместо трёх OR один компактный IN.

LIKE — поиск по шаблону:

-- Все email, заканчивающиеся на @gmail.com
SELECT * FROM пользователи WHERE email LIKE '%@gmail.com';

-- Имена, начинающиеся на "А"
SELECT * FROM пользователи WHERE имя LIKE 'А%';

-- Телефоны с кодом 495 (Москва)
SELECT * FROM пользователи WHERE телефон LIKE '+7495%';

Символ % означает «любые символы в любом количестве», _ — «один любой символ».

IS NULL / IS NOT NULL — проверка на пустые значения:

-- Пользователи без email
SELECT * FROM пользователи WHERE email IS NULL;

-- Пользователи с указанным email
SELECT * FROM пользователи WHERE email IS NOT NULL;

Работа с датами:

-- Заказы за март 2026
SELECT * FROM заказы 
WHERE дата_заказа >= '2026-03-01' 
  AND дата_заказа < '2026-04-01';

-- Заказы за последние 7 дней
SELECT * FROM заказы 
WHERE дата_заказа >= CURRENT_DATE - INTERVAL '7 days';
Внимание: WHERE применяется к исходным строкам до группировки. Если вам нужно фильтровать результаты после GROUP BY, используйте HAVING, а не WHERE.

Подходящие курсы по теме

JOIN: объединение таблиц

JOIN — ключевая конструкция реляционных БД, которая позволяет объединять данные из нескольких таблиц по общему полю. Без JOIN вы работаете только с одной таблицей, с JOIN — строите сложные аналитические запросы.

Рассмотрим две таблицы:

Таблица пользователи:

user_id имя город
1 Анна Москва
2 Сергей Казань

Таблица заказы:

order_id user_id товар цена
101 1 Ноутбук 65000
102 1 Мышь 1500
103 2 Клавиатура 3500

INNER JOIN — пересечение таблиц:

SELECT 
  пользователи.имя,
  заказы.товар,
  заказы.цена
FROM пользователи
INNER JOIN заказы ON пользователи.user_id = заказы.user_id;

Результат содержит только те строки, где есть совпадение по user_id в обеих таблицах. Если у пользователя нет заказов, он не попадёт в выборку.

LEFT JOIN — все строки из левой таблицы:

SELECT 
  пользователи.имя,
  заказы.товар,
  заказы.цена
FROM пользователи
LEFT JOIN заказы ON пользователи.user_id = заказы.user_id;

Возвращает всех пользователей. Если у пользователя нет заказов, поля из таблицы заказы будут NULL. Это полезно для анализа: «сколько пользователей ничего не купили».

RIGHT JOIN — все строки из правой таблицы:

SELECT 
  пользователи.имя,
  заказы.товар
FROM пользователи
RIGHT JOIN заказы ON пользователи.user_id = заказы.user_id;

Обратная логика LEFT JOIN — все заказы, даже если нет информации о пользователе. Используется редко.

FULL OUTER JOIN — все строки из обеих таблиц:

SELECT 
  пользователи.имя,
  заказы.товар
FROM пользователи
FULL OUTER JOIN заказы ON пользователи.user_id = заказы.user_id;

Объединяет результаты LEFT и RIGHT JOIN. Поддерживается в PostgreSQL, но отсутствует в MySQL (там используют UNION).

Множественные JOIN:

SELECT 
  пользователи.имя,
  заказы.товар,
  категории.название
FROM пользователи
INNER JOIN заказы ON пользователи.user_id = заказы.user_id
INNER JOIN категории ON заказы.category_id = категории.id;

Можно объединять три, четыре и более таблиц последовательно.

Алиасы для таблиц:

SELECT 
  u.имя,
  o.товар,
  o.цена
FROM пользователи AS u
INNER JOIN заказы AS o ON u.user_id = o.user_id;

Короткие алиасы (u, o) упрощают запись длинных запросов.

GROUP BY и агрегатные функции

GROUP BY группирует строки с одинаковыми значениями в указанном поле, а агрегатные функции вычисляют итоги по каждой группе: COUNT (количество), SUM (сумма), AVG (среднее), MIN (минимум), MAX (максимум).

Подсчёт количества заказов по городам:

SELECT 
  город,
  COUNT(*) AS количество_заказов
FROM заказы
GROUP BY город;

Результат покажет, сколько заказов пришло из каждого города.

Сумма выручки по пользователям:

SELECT 
  user_id,
  SUM(цена * количество) AS общая_выручка
FROM заказы
GROUP BY user_id;

Средний чек по месяцам:

SELECT 
  DATE_TRUNC('month', дата_заказа) AS месяц,
  AVG(цена) AS средний_чек
FROM заказы
GROUP BY месяц
ORDER BY месяц;

DATE_TRUNC округляет дату до начала месяца, позволяя группировать по периодам.

Минимальная и максимальная цена по категориям:

SELECT 
  категория,
  MIN(цена) AS минимальная_цена,
  MAX(цена) AS максимальная_цена
FROM товары
GROUP BY категория;

Группировка по нескольким полям:

SELECT 
  город,
  категория,
  COUNT(*) AS количество
FROM заказы
GROUP BY город, категория;

Это создаёт подгруппы: сначала группировка по городу, затем внутри каждого города — по категории.

HAVING — фильтрация после группировки:

SELECT 
  user_id,
  COUNT(*) AS количество_заказов,
  SUM(цена) AS сумма_покупок
FROM заказы
GROUP BY user_id
HAVING COUNT(*) > 3 AND SUM(цена) > 20000;

HAVING работает с результатами агрегации, WHERE — с исходными строками. Это частая ошибка новичков: пытаться использовать WHERE с COUNT или SUM.

Практический пример: анализ активности пользователей

SELECT 
  user_id,
  COUNT(DISTINCT дата_заказа) AS дней_с_покупками,
  COUNT(*) AS всего_заказов,
  ROUND(AVG(цена), 2) AS средний_чек,
  SUM(цена) AS общая_сумма
FROM заказы
WHERE дата_заказа >= '2026-01-01'
GROUP BY user_id
HAVING COUNT(*) >= 2
ORDER BY общая_сумма DESC
LIMIT 10;

Этот запрос находит топ-10 пользователей по выручке за 2026 год, которые сделали минимум 2 заказа.

ORDER BY: сортировка результатов

ORDER BY упорядочивает результаты запроса по одному или нескольким столбцам. По умолчанию сортировка идёт по возрастанию (ASC), для обратного порядка используется DESC.

Сортировка по одному полю:

-- По возрастанию цены
SELECT * FROM товары ORDER BY цена;

-- По убыванию цены (самые дорогие сначала)
SELECT * FROM товары ORDER BY цена DESC;

Сортировка по нескольким полям:

SELECT * FROM заказы 
ORDER BY город, дата_заказа DESC;

Сначала сортировка по городу (алфавитный порядок), затем внутри каждого города — по дате от новых к старым.

Сортировка по вычисляемому полю:

SELECT 
  товар,
  цена,
  количество,
  цена * количество AS итого
FROM заказы
ORDER BY итого DESC;

Сортировка по позиции столбца:

SELECT имя, email, город FROM пользователи ORDER BY 3;

Цифра 3 означает «сортировать по третьему столбцу в SELECT» (город). Допустимо, но менее читаемо, чем ORDER BY город.

Сортировка с NULL:

-- NULL в конце
SELECT * FROM пользователи ORDER BY email NULLS LAST;

-- NULL в начале
SELECT * FROM пользователи ORDER BY email NULLS FIRST;

В PostgreSQL можно явно указать, куда помещать NULL-значения.

Комбинация с LIMIT для топов:

-- Топ-5 самых дорогих заказов
SELECT * FROM заказы ORDER BY цена DESC LIMIT 5;

-- Топ-10 активных пользователей
SELECT 
  user_id,
  COUNT(*) AS заказов
FROM заказы
GROUP BY user_id
ORDER BY заказов DESC
LIMIT 10;

ORDER BY всегда выполняется в конце запроса, после WHERE, GROUP BY и HAVING. Это важно для понимания последовательности обработки.

INSERT, UPDATE, DELETE: изменение данных

До сих пор мы только читали данные с помощью SELECT. Теперь рассмотрим операции изменения: добавление новых записей (INSERT), обновление существующих (UPDATE) и удаление (DELETE).

INSERT — добавление новых строк:

-- Добавить одного пользователя
INSERT INTO пользователи (имя, email, город) 
VALUES ('Ирина', 'irina@mail.ru', 'Екатеринбург');

-- Добавить несколько пользователей за раз
INSERT INTO пользователи (имя, email, город) 
VALUES 
  ('Дмитрий', 'dmitry@gmail.com', 'Москва'),
  ('Ольга', 'olga@yandex.ru', 'Казань'),
  ('Павел', 'pavel@mail.ru', 'Новосибирск');

Если у таблицы есть поле с автоинкрементом (обычно id), его можно не указывать — СУБД присвоит значение автоматически.

INSERT с возвратом созданной записи (PostgreSQL):

INSERT INTO пользователи (имя, email) 
VALUES ('Алексей', 'alexey@mail.ru')
RETURNING id, имя, created_at;

RETURNING позволяет сразу получить созданную запись с её id и другими полями.

UPDATE — обновление существующих записей:

-- Изменить email одного пользователя
UPDATE пользователи 
SET email = 'new_email@gmail.com' 
WHERE user_id = 5;

-- Обновить несколько полей
UPDATE пользователи 
SET 
  город = 'Санкт-Петербург',
  статус = 'активный',
  обновлено_в = CURRENT_TIMESTAMP
WHERE user_id = 10;

UPDATE с условием на основе вычислений:

-- Применить скидку 10% ко всем товарам дороже 50 000
UPDATE товары 
SET цена = цена * 0.9 
WHERE цена > 50000;

DELETE — удаление строк:

-- Удалить одного пользователя
DELETE FROM пользователи WHERE user_id = 15;

-- Удалить всех неактивных пользователей
DELETE FROM пользователи WHERE статус = 'неактивный';

-- Удалить заказы старше года
DELETE FROM заказы 
WHERE дата_заказа < CURRENT_DATE - INTERVAL '1 year';
Внимание: UPDATE и DELETE без WHERE изменят или удалят ВСЕ строки в таблице. Всегда проверяйте условие перед выполнением. Безопаснее сначала запустить SELECT с тем же WHERE, чтобы увидеть, какие строки будут затронуты.

TRUNCATE — быстрое удаление всех данных:

TRUNCATE TABLE пользователи;

Работает быстрее DELETE, но удаляет все строки без возможности отката (если нет транзакций).

Транзакции для безопасности:

BEGIN;
UPDATE счета SET баланс = баланс - 1000 WHERE user_id = 1;
UPDATE счета SET баланс = баланс + 1000 WHERE user_id = 2;
COMMIT;

Транзакция гарантирует, что либо выполнятся обе операции, либо ни одна. Если что-то пошло не так, используйте ROLLBACK для отмены изменений.

Подзапросы (subqueries)

Подзапрос — это SELECT внутри другого SELECT. Он позволяет использовать результаты одного запроса в качестве данных для другого. Подзапросы делают код более читаемым и гибким.

Подзапрос в WHERE:

-- Найти пользователей, которые сделали заказ дороже среднего
SELECT * FROM пользователи
WHERE user_id IN (
  SELECT user_id FROM заказы 
  WHERE цена > (SELECT AVG(цена) FROM заказы)
);

Внутренний подзапрос вычисляет среднюю цену, затем находит заказы выше средней, и в итоге возвращаются пользователи этих заказов.

Подзапрос в SELECT:

SELECT 
  имя,
  (SELECT COUNT(*) FROM заказы WHERE заказы.user_id = пользователи.user_id) AS количество_заказов
FROM пользователи;

Для каждого пользователя подзапрос считает количество его заказов. Это называется коррелированный подзапрос — он зависит от внешнего запроса.

Подзапрос в FROM (производная таблица):

SELECT 
  город,
  AVG(сумма_заказов) AS средняя_сумма_на_пользователя
FROM (
  SELECT 
    пользователи.город,
    SUM(заказы.цена) AS сумма_заказов
  FROM пользователи
  JOIN заказы ON пользователи.user_id = заказы.user_id
  GROUP BY пользователи.user_id, пользователи.город
) AS пользовательские_суммы
GROUP BY город;

Подзапрос сначала считает сумму заказов каждого пользователя, затем внешний запрос группирует по городам и вычисляет среднее.

EXISTS — проверка существования:

-- Пользователи, у которых есть хотя бы один заказ
SELECT * FROM пользователи
WHERE EXISTS (
  SELECT 1 FROM заказы WHERE заказы.user_id = пользователи.user_id
);

EXISTS возвращает TRUE, если подзапрос нашёл хотя бы одну строку. Часто работает быстрее, чем JOIN или IN.

NOT EXISTS — обратная логика:

-- Пользователи без заказов
SELECT * FROM пользователи
WHERE NOT EXISTS (
  SELECT 1 FROM заказы WHERE заказы.user_id = пользователи.user_id
);

Подзапросы с ANY / ALL:

-- Товары дороже любого товара из категории "Аксессуары"
SELECT * FROM товары
WHERE цена > ANY (
  SELECT цена FROM товары WHERE категория = 'Аксессуары'
);

-- Товары дороже всех товаров из категории "Аксессуары"
SELECT * FROM товары
WHERE цена > ALL (
  SELECT цена FROM товары WHERE категория = 'Аксессуары'
);

Подзапросы мощные, но могут снижать производительность на больших данных. Часто их можно заменить на JOIN или CTE (Common Table Expressions).

Оконные функции (window functions)

Оконные функции — продвинутый инструмент SQL, который позволяет выполнять вычисления по группам строк (окнам) без схлопывания результата, как в GROUP BY. Это ключевой навык для middle-аналитика.

Базовый синтаксис:

функция() OVER (
  PARTITION BY поле_группировки 
  ORDER BY поле_сортировки
)

ROW_NUMBER — нумерация строк:

SELECT 
  имя,
  город,
  зарплата,
  ROW_NUMBER() OVER (PARTITION BY город ORDER BY зарплата DESC) AS ранг_в_городе
FROM сотрудники;

Для каждого города присваивается номер от 1 (самая высокая зарплата) до N.

RANK и DENSE_RANK:

SELECT 
  товар,
  цена,
  RANK() OVER (ORDER BY цена DESC) AS ранг,
  DENSE_RANK() OVER (ORDER BY цена DESC) AS плотный_ранг
FROM товары;

RANK пропускает номера при одинаковых значениях (1, 2, 2, 4), DENSE_RANK нет (1, 2, 2, 3).

SUM/AVG/COUNT с окнами — накопительные итоги:

SELECT 
  дата_заказа,
  выручка,
  SUM(выручка) OVER (ORDER BY дата_заказа) AS накопительная_выручка
FROM продажи
ORDER BY дата_заказа;

Показывает, как растёт выручка день за днём.

LAG и LEAD — доступ к предыдущим и следующим строкам:

SELECT 
  дата,
  продажи,
  LAG(продажи, 1) OVER (ORDER BY дата) AS продажи_вчера,
  продажи - LAG(продажи, 1) OVER (ORDER BY дата) AS изменение
FROM ежедневные_продажи;

LAG(продажи, 1) возвращает значение из предыдущей строки, LEAD — из следующей. Это удобно для расчёта динамики.

FIRST_VALUE и LAST_VALUE:

SELECT 
  дата,
  цена,
  FIRST_VALUE(цена) OVER (ORDER BY дата) AS цена_первого_дня,
  LAST_VALUE(цена) OVER (ORDER BY дата ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS цена_последнего_дня
FROM цены_товаров;

Практический пример: топ-3 товара по выручке в каждой категории

WITH ranked_products AS (
  SELECT 
    категория,
    товар,
    выручка,
    RANK() OVER (PARTITION BY категория ORDER BY выручка DESC) AS ранг
  FROM продажи_по_товарам
)
SELECT * FROM ranked_products WHERE ранг <= 3;

Оконные функции позволяют решать задачи, невозможные с обычным GROUP BY: сравнение с предыдущим периодом, ранжирование внутри групп, скользящие средние.

CTE (Common Table Expressions)

CTE (Common Table Expressions) — временные именованные результаты запросов, которые существуют только во время выполнения основного запроса. Они делают сложные запросы читаемыми и структурированными, заменяя вложенные подзапросы.

Базовый синтаксис:

WITH название_cte AS (
  SELECT ...
)
SELECT * FROM название_cte;

Простой пример:

WITH высокие_заказы AS (
  SELECT * FROM заказы WHERE цена > 10000
)
SELECT 
  COUNT(*) AS количество,
  AVG(цена) AS средняя_цена
FROM высокие_заказы;

Вместо подзапроса в FROM мы создали читаемую конструкцию с понятным именем.

Несколько CTE в одном запросе:

WITH 
активные_пользователи AS (
  SELECT user_id FROM пользователи WHERE статус = 'активный'
),
недавние_заказы AS (
  SELECT * FROM заказы WHERE дата_заказа >= CURRENT_DATE - 30
)
SELECT 
  u.имя,
  COUNT(o.order_id) AS заказов_за_месяц
FROM активные_пользователи au
JOIN пользователи u ON au.user_id = u.user_id
JOIN недавние_заказы o ON u.user_id = o.user_id
GROUP BY u.имя;

Рекурсивные CTE — обход иерархий:

WITH RECURSIVE подчинённые AS (
  -- Начальная точка: найти менеджера верхнего уровня
  SELECT employee_id, имя, manager_id, 1 AS уровень
  FROM сотрудники
  WHERE manager_id IS NULL
  
  UNION ALL
  
  -- Рекурсивная часть: найти всех подчинённых
  SELECT e.employee_id, e.имя, e.manager_id, p.уровень + 1
  FROM сотрудники e
  JOIN подчинённые p ON e.manager_id = p.employee_id
)
SELECT * FROM подчинённые ORDER BY уровень, имя;

Рекурсивные CTE используются для построения организационных структур, категорий товаров с подкатегориями, графов зависимостей.

CTE для разбиения сложного запроса:

WITH 
продажи_по_месяцам AS (
  SELECT 
    DATE_TRUNC('month', дата_заказа) AS месяц,
    SUM(сумма) AS выручка
  FROM заказы
  GROUP BY месяц
),
средняя_выручка AS (
  SELECT AVG(выручка) AS среднее FROM продажи_по_месяцам
)
SELECT 
  m.месяц,
  m.выручка,
  a.среднее,
  ROUND((m.выручка - a.среднее) / a.среднее * 100, 2) AS отклонение_процент
FROM продажи_по_месяцам m
CROSS JOIN средняя_выручка a
ORDER BY m.месяц;

Этот запрос находит месяцы с выручкой выше или ниже средней и показывает отклонение в процентах.

Совет: Используйте CTE вместо вложенных подзапросов, когда запрос становится сложным. Это делает код понятным для коллег и упрощает отладку. В PostgreSQL CTE можно использовать для оптимизации через материализацию.

Индексы и оптимизация запросов

Индексы — это структуры данных, которые ускоряют поиск информации в таблице. Без индексов СУБД сканирует всю таблицу построчно (full table scan), с индексами — находит нужные строки почти мгновенно.

Как работают индексы:

Представьте книгу без оглавления: чтобы найти нужную главу, придётся листать все страницы. Индекс — это оглавление БД, которое указывает, где находятся конкретные данные.

Создание индекса:

-- Индекс по одному полю
CREATE INDEX idx_users_email ON пользователи(email);

-- Составной индекс (по нескольким полям)
CREATE INDEX idx_orders_user_date ON заказы(user_id, дата_заказа);

-- Уникальный индекс (гарантирует отсутствие дубликатов)
CREATE UNIQUE INDEX idx_users_email_unique ON пользователи(email);

Когда индексы помогают:

  • WHERE с условиями на индексированные поля
  • JOIN по полям с индексами
  • ORDER BY по индексированным столбцам
  • MIN/MAX на индексированных полях

Когда индексы НЕ нужны:

  • Таблицы с малым количеством строк (до 1000)
  • Поля с низкой селективностью (например, пол: М/Ж)
  • Столбцы, которые часто изменяются (индексы замедляют INSERT/UPDATE)

EXPLAIN — анализ плана запроса:

EXPLAIN ANALYZE
SELECT * FROM заказы WHERE user_id = 123;

EXPLAIN показывает, как СУБД выполняет запрос: использует ли индексы, сколько строк сканирует, сколько времени занимает операция.

Оптимизация запросов — лучшие практики:

  • Избегайте SELECT * — выбирайте только нужные поля
  • Используйте WHERE рано — фильтруйте данные до JOIN, а не после
  • Индексируйте поля в JOIN и WHERE — это критично для больших таблиц
  • Избегайте функций в WHERE — WHERE YEAR(дата) = 2026 не использует индекс, WHERE дата >= '2026-01-01' AND дата < '2027-01-01' использует
  • LIMIT на больших выборках — если не нужны все результаты
  • Используйте EXISTS вместо IN для подзапросов с большими результатами

Пример оптимизации:

Медленный запрос:

SELECT * FROM заказы 
WHERE EXTRACT(YEAR FROM дата_заказа) = 2026;

Быстрый запрос:

CREATE INDEX idx_orders_date ON заказы(дата_заказа);

SELECT * FROM заказы 
WHERE дата_заказа >= '2026-01-01' AND дата_заказа < '2027-01-01';

Разница в скорости может достигать сотен раз на таблицах с миллионами строк.

Продвинутые техники: A/B-тестирование, когортный анализ

SQL используется не только для простых выборок, но и для сложной продуктовой аналитики. Две ключевые задачи для middle-аналитика — A/B-тестирование и когортный анализ.

A/B-тестирование в SQL:

A/B-тест сравнивает две версии продукта (контрольную A и тестовую B), чтобы понять, какая работает лучше. SQL помогает вычислить метрики для каждой группы.

WITH тест_группы AS (
  SELECT 
    user_id,
    CASE 
      WHEN user_id % 2 = 0 THEN 'A'
      ELSE 'B'
    END AS группа
  FROM пользователи
  WHERE дата_регистрации >= '2026-03-01'
),
метрики AS (
  SELECT 
    t.группа,
    COUNT(DISTINCT t.user_id) AS пользователей,
    COUNT(o.order_id) AS заказов,
    ROUND(COUNT(o.order_id)::NUMERIC / COUNT(DISTINCT t.user_id), 2) AS заказов_на_пользователя,
    ROUND(AVG(o.сумма), 2) AS средний_чек
  FROM тест_группы t
  LEFT JOIN заказы o ON t.user_id = o.user_id
  GROUP BY t.группа
)
SELECT * FROM метрики;

Результат покажет конверсию и средний чек для каждой группы.

Когортный анализ:

Когорта — группа пользователей, объединённых общим признаком (обычно месяцем регистрации). Когортный анализ показывает, как меняется поведение когорт со временем.

WITH когорты AS (
  SELECT 
    user_id,
    DATE_TRUNC('month', дата_регистрации) AS когорта
  FROM пользователи
),
активность AS (
  SELECT 
    k.когорта,
    DATE_TRUNC('month', o.дата_заказа) AS месяц_активности,
    COUNT(DISTINCT o.user_id) AS активных_пользователей
  FROM когорты k
  JOIN заказы o ON k.user_id = o.user_id
  GROUP BY k.когорта, месяц_активности
),
размеры_когорт AS (
  SELECT 
    когорта,
    COUNT(DISTINCT user_id) AS размер_когорты
  FROM когорты
  GROUP BY когорта
)
SELECT 
  a.когорта,
  a.месяц_активности,
  a.активных_пользователей,
  r.размер_когорты,
  ROUND(a.активных_пользователей::NUMERIC / r.размер_когорты * 100, 2) AS retention_percent
FROM активность a
JOIN размеры_когорт r ON a.когорта = r.когорта
ORDER BY a.когорта, a.месяц_активности;

Этот запрос показывает retention (удержание) пользователей: какой процент когорты остаётся активным через месяц, два, три.

RFM-анализ (Recency, Frequency, Monetary):

WITH rfm AS (
  SELECT 
    user_id,
    CURRENT_DATE - MAX(дата_заказа) AS дней_с_последнего_заказа,
    COUNT(*) AS количество_заказов,
    SUM(сумма) AS общая_сумма
  FROM заказы
  GROUP BY user_id
)
SELECT 
  user_id,
  CASE 
    WHEN дней_с_последнего_заказа <= 30 THEN 'Активный'
    WHEN дней_с_последнего_заказа <= 90 THEN 'Засыпающий'
    ELSE 'Потерянный'
  END AS сегмент_по_recency,
  CASE 
    WHEN количество_заказов >= 10 THEN 'VIP'
    WHEN количество_заказов >= 3 THEN 'Лояльный'
    ELSE 'Разовый'
  END AS сегмент_по_frequency,
  общая_сумма
FROM rfm
ORDER BY общая_сумма DESC;

RFM-сегментация помогает выделить ценных клиентов и настроить персонализированный маркетинг.

SQL в связке с Python и BI-инструментами

SQL редко используется изолированно. В реальной работе аналитик комбинирует SQL с языками программирования (Python, R) и инструментами визуализации (Tableau, Power BI, Metabase).

SQL + Python:

Python библиотеки позволяют выполнять SQL-запросы из кода и обрабатывать результаты:

import pandas as pd
import psycopg2

# Подключение к PostgreSQL
conn = psycopg2.connect(
    host="localhost",
    database="analytics",
    user="analyst",
    password="password"
)

# Выполнение SQL-запроса и загрузка в DataFrame
query = """
    SELECT 
        дата_заказа,
        SUM(сумма) AS выручка
    FROM заказы
    WHERE дата_заказа >= '2026-01-01'
    GROUP BY дата_заказа
    ORDER BY дата_заказа
"""

df = pd.read_sql(query, conn)

# Дальнейшая обработка в pandas
df['скользящее_среднее_7д'] = df['выручка'].rolling(7).mean()

conn.close()

Это позволяет использовать мощь SQL для извлечения данных и возможности Python для сложной аналитики, машинного обучения, статистических тестов.

SQL + Tableau/Power BI:

BI-инструменты подключаются к базам данных и позволяют строить интерактивные дашборды. Аналитик пишет SQL-запросы для создания витрин данных (data marts), а затем визуализирует их:

  • Tableau — подключается к PostgreSQL, MySQL, BigQuery; поддерживает кастомные SQL-запросы
  • Power BI — интеграция с MS SQL Server, Azure; встроенный редактор DAX и SQL
  • Metabase — open-source, позволяет писать SQL и сразу строить графики
  • Redash — ещё один open-source инструмент для SQL-дашбордов

Типичный workflow:

  1. Аналитик пишет SQL-запрос в DBeaver, проверяет результаты
  2. Сохраняет запрос как представление (VIEW) или витрину данных
  3. Подключает BI-инструмент к этой витрине
  4. Строит визуализации: графики, таблицы, KPI-карточки
  5. Публикует дашборд для команды

SQL + Jupyter Notebooks:

Jupyter поддерживает SQL через расширения (ipython-sql, JupySQL), позволяя писать SQL-запросы прямо в ячейках ноутбука:

%load_ext sql
%sql postgresql://user:password@localhost/database

%%sql
SELECT 
    категория,
    COUNT(*) AS товаров,
    AVG(цена) AS средняя_цена
FROM товары
GROUP BY категория
ORDER BY товаров DESC;

Это удобно для исследовательского анализа данных (EDA) и документирования процесса аналитики.

SQL + Apache Airflow:

Airflow — платформа для автоматизации и оркестрации задач. SQL-запросы оформляются как DAG (направленный ациклический граф), который выполняется по расписанию:

  • Ежедневная загрузка данных из источника в хранилище
  • Обновление витрин данных
  • Отправка отчётов по email

Это уже уровень data engineer, но понимание связки SQL + автоматизация критично для роста до senior-позиций.

Где практиковаться бесплатно: Stepik, SQL Academy, SQL-EX, Karpov.Courses

Теория без практики бесполезна. Ниже — проверенные платформы для оттачивания SQL-навыков от базовых запросов до продвинутых техник.

Stepik — Интерактивный тренажёр по SQL

Бесплатный курс с автоматической проверкой задач. Начинается с SELECT, заканчивается оконными функциями и подзапросами. Удобный редактор кода прямо в браузере, мгновенная обратная связь. Подходит для абсолютных новичков.

Плюсы:

  • Полностью бесплатно
  • Структурированная программа от простого к сложному
  • Реальная БД с данными для практики
  • Сертификат по завершении

Минусы:

  • Интерфейс может показаться устаревшим
  • Нет живого сообщества для обсуждения

SQL Academy

Интерактивная платформа с игровым подходом. Задачи разбиты на уровни, есть рейтинг пользователей. Охватывает базовые и продвинутые темы: JOIN, GROUP BY, подзапросы, оконные функции.

Плюсы:

  • Бесплатный доступ к основным урокам
  • Визуальные схемы баз данных
  • Понятные объяснения с примерами
  • Подходит для самостоятельного изучения

Минусы:

  • Некоторые продвинутые разделы платные
  • Меньше задач, чем на специализированных платформах

SQL-EX.RU

Платформа с акцентом на решение практических задач. Более 100 упражнений разной сложности: от простых SELECT до сложных аналитических запросов. Подходит для тех, кто хочет углубить знания после базового курса.

Плюсы:

  • Большая база задач с реалистичными сценариями
  • Рейтинг решений и обсуждение подходов
  • Поддержка разных СУБД (MS SQL, PostgreSQL, MySQL)

Минусы:

  • Доступ к части задач платный
  • Интерфейс требует привыкания
  • Нет структурированной теории

Karpov.Courses — Симулятор SQL

Бесплатный тренажёр от образовательной платформы Karpov.Courses. Задачи построены на реальных данных: таблицы пользователей, заказов, курьеров. Фокус на продуктовой аналитике и метриках.

Плюсы:

  • Бесплатный доступ к симулятору
  • Практические задачи из реальной работы аналитика
  • Подсказки и разборы решений
  • Современный интерфейс

Минусы:

  • Требует базовых знаний SQL
  • Полный курс платный

LeetCode — раздел Database

Платформа для подготовки к собеседованиям. SQL-задачи разделены по сложности: Easy, Medium, Hard. Фокус на алгоритмических аспектах и оптимизации запросов.

Плюсы:

  • Реальные задачи с собеседований в технологичных компаниях
  • Обсуждения решений от сообщества
  • Подготовка к интервью

Минусы:

  • Большинство задач на английском
  • Платная подписка для доступа ко всем задачам

HackerRank — SQL

Аналог LeetCode с разделом SQL. Задачи от базовых до продвинутых, с автоматической проверкой.

Рекомендация: начните с Stepik или SQL Academy для освоения основ, затем переходите к SQL-EX и Karpov.Courses для практики на реальных кейсах. LeetCode и HackerRank используйте для подготовки к собеседованиям.

Обзор платных курсов 2026: Skillbox, Нетология, SkillFactory, Eduson, ВШЭ

Если вам нужна структурированная программа с обратной связью от наставников и проектами в портфолио, рассмотрите платные курсы. Ниже — актуальные предложения на март 2026 года.

Skillbox — SQL для анализа данных

Длительность 2 месяца, рассрочка 6 месяцев по 8 459 рублей, полная стоимость 50 754 рубля (со скидкой 45% от 92 280 рублей). Вы освоите язык запросов SQL и сможете самостоятельно получать нужные данные, сопоставлять и анализировать их.

Программа:

  • Основы баз данных и реляционных моделей
  • SELECT, WHERE, JOIN, GROUP BY
  • Подзапросы и CTE
  • Оконные функции
  • Особенности работы в MySQL, PostgreSQL, MS SQL
  • Проект в портфолио

Подходит: начинающим аналитикам, маркетологам, продакт-менеджерам.

Нетология — SQL и получение данных

Длительность 2 месяца, стоимость со скидкой, оплатите курс до 24 февраля. Средняя стоимость около 22 900 рублей с рассрочкой от 2 008 рублей в месяц.

Программа:

  • Основы SQL: SELECT, фильтрация, сортировка
  • Объединение таблиц через JOIN
  • Агрегатные функции и группировки
  • Задачи по сегментации, когортам, A/B-тестированию
  • Помощь с резюме и портфолио

Подходит: специалистам роста, маркетологам, аналитикам без опыта SQL.

SkillFactory — Курс по SQL для анализа данных

Длительность 7–15 недель в зависимости от темпа обучения. Стоимость варьируется, в среднем от 30 000 до 60 000 рублей.

Программа:

  • Основы и продвинутый SQL
  • PostgreSQL и работа с большими данными
  • Оконные функции и оптимизация
  • Интеграция с Python и Jupyter
  • Реальные проекты из e-commerce и финтех

Подходит: аналитикам данных, будущим data scientists.

Eduson Academy — SQL с нуля для анализа данных

Длительность 3–4 недели (экспресс-формат). Стоимость от 3 552 рублей в месяц при рассрочке, полная цена около 42 624 рублей.

Программа:

  • Много практики на кейсах и тренажерах, личный куратор ответит на любой вопрос, вечный доступ к курсу и обновлениям
  • Основы SQL и работа с PostgreSQL
  • Продвинутые запросы и аналитика
  • Проектная работа

Подходит: новичкам, которым нужен быстрый старт.

ВШЭ — Курсы по анализу данных с SQL

Длительность 2 месяца. Стоимость выше среднерыночной — от 50 000 до 80 000 рублей в зависимости от программы.

Программа:

  • Академический подход к базам данных
  • SQL в контексте аналитики и статистики
  • Проектная работа с реальными данными
  • Сертификат от ВШЭ

Подходит: тем, кому важен престижный сертификат и академическая программа.

МГТУ им. Баумана

Стоимость около 52 000 рублей за 34 академических часа. Программа ориентирована на технических специалистов и разработчиков.

Сравнительная таблица курсов: цены, сроки, программы

Школа Длительность Стоимость Рассрочка Ключевые особенности
Skillbox 2 месяца 50 754 ₽ от 1 733 ₽/мес MySQL, PostgreSQL, MS SQL; проект в портфолио
Нетология 2 месяца 22 900 ₽ от 2 008 ₽/мес Бизнес-кейсы, A/B-тестирование, когорты
SkillFactory 7–15 недель 30 000–60 000 ₽ Индивидуально PostgreSQL, интеграция с Python, большие данные
Eduson Academy 3–4 недели 42 624 ₽ от 3 552 ₽/мес Экспресс-формат, вечный доступ, личный куратор
ВШЭ 2 месяца 50 000–80 000 ₽ Зависит от программы Академический подход, сертификат ВШЭ
МГТУ Баумана 34 ак. часа 52 000 ₽ Нет данных Для технических специалистов и разработчиков

Средняя стоимость курсов SQL в 2026 году: 43 727 рублей. Диапазон цен: от бесплатных (Stepik, SQL Academy) до 201 990 рублей за продвинутые программы с менторством.

Рекомендации по выбору:

  • Ограниченный бюджет: Нетология (22 900 ₽) или бесплатные ресурсы + самообучение
  • Быстрый старт: Eduson Academy (3–4 недели)
  • Глубокое погружение: SkillFactory или Skillbox с проектами
  • Престижный сертификат: ВШЭ или МГТУ Баумана
  • Аналитика + Python: SkillFactory

Типичные ошибки начинающих и как их избежать

Изучая SQL, новички совершают предсказуемые ошибки. Зная их заранее, вы сэкономите часы отладки.

1. Путаница WHERE и HAVING

WHERE фильтрует строки до группировки, HAVING — после. Попытка использовать агрегатную функцию в WHERE приведёт к ошибке:

-- Ошибка
SELECT город, COUNT(*) FROM заказы 
WHERE COUNT(*) > 10 
GROUP BY город;

-- Правильно
SELECT город, COUNT(*) FROM заказы 
GROUP BY город 
HAVING COUNT(*) > 10;

2. Забытый GROUP BY при использовании агрегатов

-- Ошибка: город не в GROUP BY
SELECT город, COUNT(*) FROM заказы;

-- Правильно
SELECT город, COUNT(*) FROM заказы GROUP BY город;

3. SELECT * в продакшене

На больших таблицах это замедляет запросы и перегружает сеть. Выбирайте только нужные поля.

4. Игнорирование NULL

NULL — это не ноль и не пустая строка. Сравнения с NULL через = не работают:

-- Не сработает
SELECT * FROM пользователи WHERE email = NULL;

-- Правильно
SELECT * FROM пользователи WHERE email IS NULL;

5. Неправильные JOIN без условий

Забытое условие ON приводит к декартову произведению — каждая строка из первой таблицы умножается на каждую из второй:

-- Ошибка: миллионы строк вместо тысяч
SELECT * FROM пользователи JOIN заказы;

-- Правильно
SELECT * FROM пользователи JOIN заказы ON пользователи.id = заказы.user_id;

6. Неоптимизированные запросы с подзапросами

Коррелированные подзапросы могут выполняться для каждой строки. Часто их можно заменить JOIN:

-- Медленно
SELECT имя, (SELECT COUNT(*) FROM заказы WHERE user_id = пользователи.id) 
FROM пользователи;

-- Быстрее
SELECT u.имя, COUNT(o.id) 
FROM пользователи u 
LEFT JOIN заказы o ON u.id = o.user_id 
GROUP BY u.имя;

7. Использование DISTINCT вместо правильного JOIN

DISTINCT маскирует проблему дублирования строк. Лучше понять причину и исправить JOIN.

8. Игнорирование типов данных

-- Может не работать, если поле строковое
SELECT * FROM товары WHERE id = '123';

-- Безопаснее привести тип явно
SELECT * FROM товары WHERE id = 123;
Внимание: Перед выполнением UPDATE или DELETE всегда запускайте SELECT с тем же WHERE, чтобы проверить, какие строки будут затронуты. Один неверный запрос может удалить критичные данные без возможности восстановления.

Подготовка к собеседованию: задачи, кейсы, вопросы

На собеседовании на позицию аналитика данных или junior SQL-разработчика вас ждут теоретические вопросы и практические задачи. Вот что нужно знать.

Теоретические вопросы:

  • Что такое первичный и внешний ключи?
  • В чём разница между INNER JOIN и LEFT JOIN?
  • Чем отличается WHERE от HAVING?
  • Что такое индекс и зачем он нужен?
  • Объясните ACID-свойства транзакций
  • Что такое нормализация БД?
  • В чём разница между DELETE, TRUNCATE и DROP?
  • Как работает GROUP BY?
  • Что такое оконные функции?

Практические задачи — типовые паттерны:

Задача 1: Найти пользователей без заказов

SELECT u.* FROM пользователи u
LEFT JOIN заказы o ON u.id = o.user_id
WHERE o.id IS NULL;

Задача 2: Топ-3 товара по выручке в каждой категории

WITH ranked AS (
  SELECT 
    категория,
    товар,
    выручка,
    RANK() OVER (PARTITION BY категория ORDER BY выручка DESC) AS ранг
  FROM продажи
)
SELECT * FROM ranked WHERE ранг <= 3;

Задача 3: Найти дубликаты по email

SELECT email, COUNT(*) 
FROM пользователи 
GROUP BY email 
HAVING COUNT(*) > 1;

Задача 4: Рассчитать retention по месяцам

WITH первые_заказы AS (
  SELECT user_id, MIN(дата_заказа) AS первый_заказ
  FROM заказы GROUP BY user_id
)
SELECT 
  DATE_TRUNC('month', f.первый_заказ) AS когорта,
  DATE_TRUNC('month', o.дата_заказа) AS месяц,
  COUNT(DISTINCT o.user_id) AS активных
FROM первые_заказы f
JOIN заказы o ON f.user_id = o.user_id
GROUP BY когорта, месяц;

Задача 5: Найти второй по величине оклад

SELECT MAX(зарплата) FROM сотрудники
WHERE зарплата < (SELECT MAX(зарплата) FROM сотрудники);

Или через оконные функции:

SELECT DISTINCT зарплата 
FROM (
  SELECT зарплата, DENSE_RANK() OVER (ORDER BY зарплата DESC) AS ранг
  FROM сотрудники
) t
WHERE ранг = 2;

Советы для собеседования:

  • Проговаривайте логику вслух, объясняя каждый шаг
  • Начните с простого решения, затем оптимизируйте
  • Спрашивайте уточнения: какой СУБД, есть ли индексы, размер таблиц
  • Используйте CTE для читаемости сложных запросов
  • Покажите знание оконных функций — это уровень middle
  • Подготовьте 2–3 проекта в портфолио с SQL-запросами

Ресурсы для тренировки:

  • LeetCode Database — задачи уровня FAANG
  • HackerRank SQL — от Easy до Hard
  • SQL-EX — российская платформа с реалистичными кейсами
  • StrataScratch — реальные вопросы с собеседований

Сертификации: Oracle, Microsoft, Databricks

Сертификация подтверждает уровень владения SQL и повышает шансы при трудоустройстве, особенно в корпоративном сегменте.

Oracle Database SQL Certified Associate

Официальная сертификация Oracle для SQL-разработчиков. Экзамен проверяет знания:

  • SELECT, JOIN, подзапросы
  • GROUP BY, агрегатные функции
  • DDL (CREATE, ALTER, DROP)
  • DML (INSERT, UPDATE, DELETE)
  • Индексы, представления, последовательности

Стоимость: около 17 000 рублей за экзамен. Подготовка занимает 2–3 месяца при наличии базовых знаний SQL.

Кому подходит: разработчикам БД, администраторам, аналитикам, работающим с Oracle Database.

Microsoft Certified: Azure Data Fundamentals (DP-900)

Базовая сертификация Microsoft по работе с данными в облаке Azure. Включает SQL, но также NoSQL и аналитические сервисы.

Темы:

  • Реляционные БД и SQL
  • Azure SQL Database
  • Основы аналитики данных
  • Data warehousing

Стоимость: около 5 000–7 000 рублей. Экзамен на английском, 60 минут.

Кому подходит: аналитикам и разработчикам, работающим в Microsoft-экосистеме.

Databricks Certified Associate Developer for Apache Spark

Сертификация для работы с большими данными через Spark SQL.

Темы:

  • Spark SQL синтаксис
  • DataFrames и таблицы
  • Оптимизация запросов
  • Delta Lake

Стоимость: около 18 000 рублей. Требует понимания распределённых систем.

Кому подходит: data engineers, аналитикам больших данных.

Стоит ли получать сертификацию?

Плюсы:

  • Повышает доверие работодателей
  • Структурирует знания
  • Даёт преимущество при найме в крупных компаниях
  • Подтверждает уровень владения конкретной СУБД

Минусы:

  • Дорого (от 17 000 рублей)
  • Требует времени на подготовку
  • Многие работодатели смотрят на портфолио, а не сертификаты

Рекомендация: Если вы работаете в корпоративной среде (Oracle, MS SQL Server) или планируете переход в крупную компанию — сертификация полезна. Для стартапов и продуктовых компаний важнее реальные проекты и опыт решения бизнес-задач.

Roadmap обучения: от новичка до Middle-специалиста

Чёткий план помогает не распыляться и двигаться последовательно от основ к продвинутым техникам. Вот проверенный roadmap.

Этап 1: Основы (2–4 недели)

  • Изучите структуру реляционных БД: таблицы, строки, столбцы, ключи
  • Освойте SELECT, WHERE, ORDER BY, LIMIT
  • Научитесь фильтровать данные: операторы сравнения, LIKE, BETWEEN, IN
  • Установите DBeaver, подключитесь к тестовой БД
  • Решите 20–30 задач на Stepik или SQL Academy

Этап 2: Объединения и группировки (2–3 недели)

  • Изучите все типы JOIN: INNER, LEFT, RIGHT, FULL OUTER
  • Освойте GROUP BY и агрегатные функции: COUNT, SUM, AVG, MIN, MAX
  • Поймите разницу WHERE и HAVING
  • Решите 30–50 задач с JOIN и группировками на SQL-EX

Этап 3: Изменение данных (1 неделя)

  • INSERT, UPDATE, DELETE
  • Транзакции: BEGIN, COMMIT, ROLLBACK
  • CREATE TABLE, ALTER TABLE, DROP TABLE
  • Создайте собственную тестовую БД, заполните данными

Этап 4: Подзапросы и CTE (2–3 недели)

  • Подзапросы в WHERE, SELECT, FROM
  • EXISTS, NOT EXISTS, ANY, ALL
  • CTE (WITH) для структурирования сложных запросов
  • Рекурсивные CTE
  • Решите 20–30 задач среднего уровня

Этап 5: Оконные функции (2–3 недели)

  • ROW_NUMBER, RANK, DENSE_RANK
  • LAG, LEAD для работы с временными рядами
  • SUM/AVG с PARTITION BY
  • FIRST_VALUE, LAST_VALUE
  • Решите 20–30 задач на оконные функции

Этап 6: Оптимизация и продвинутые темы (2–4 недели)

  • Индексы: создание, типы, когда применять
  • EXPLAIN для анализа плана запроса
  • Оптимизация JOIN и подзапросов
  • Партиционирование таблиц
  • Материализованные представления

Этап 7: Практические проекты (4–6 недель)

  • Создайте аналитический проект: найдите открытый датасет (Kaggle, GitHub)
  • Загрузите данные в PostgreSQL
  • Постройте витрины данных для анализа: продажи по месяцам, топ-клиенты, retention
  • Реализуйте когортный анализ, RFM-сегментацию
  • Оформите проект на GitHub с описанием задачи и SQL-запросами

Этап 8: Интеграция с другими инструментами (по желанию, 2–3 недели)

  • SQL + Python: библиотеки psycopg2, SQLAlchemy, pandas
  • SQL + Tableau/Power BI: создание дашбордов
  • SQL + Jupyter Notebooks для аналитических отчётов

Общее время до уровня Middle: 4–6 месяцев при темпе 10–15 часов в неделю. Ключевой момент — регулярная практика. Лучше 30 минут каждый день, чем 5 часов раз в неделю.

Чек-лист Middle SQL-аналитика:

  • Уверенно пишете SELECT, JOIN, GROUP BY без подсказок
  • Используете оконные функции для сложных аналитических задач
  • Применяете CTE для структурирования запросов
  • Понимаете планы выполнения запросов (EXPLAIN)
  • Создали 2–3 проекта с реальными данными
  • Можете объяснить разницу между RANK, DENSE_RANK, ROW_NUMBER
  • Решили 100+ задач на SQL-платформах

Заключение: практика, проекты, портфолио

SQL — инструмент, который раскрывается только через практику. Теория даёт основу, но уверенность приходит после сотен написанных запросов и десятков решённых аналитических задач.

Три принципа эффективного обучения SQL:

1. Практика важнее теории

Не застревайте в бесконечном изучении курсов. Освоили SELECT и WHERE? Сразу переходите к задачам на Stepik. Изучили JOIN? Решайте кейсы на SQL-EX. Мышечная память в программировании формируется через повторение.

2. Реальные проекты дают больше, чем учебные задачи

После базового уровня найдите открытый датасет (продажи, пользователи, транзакции) и постройте на его основе аналитический проект:

  • Загрузите данные в PostgreSQL
  • Сформулируйте 5–7 бизнес-вопросов
  • Напишите SQL-запросы для ответов
  • Оформите результаты в Jupyter Notebook или Google Colab
  • Опубликуйте на GitHub

Это портфолио, которое покажет работодателю вашу способность решать реальные задачи.

3. Обратная связь ускоряет рост

Если учитесь самостоятельно, присоединяйтесь к сообществам: Телеграм-каналы по аналитике данных, форумы SQL.ru, Reddit r/SQL. Показывайте свои запросы, спрашивайте, как их улучшить. Платные курсы с менторами дают структурированную обратную связь, но её можно получить и бесплатно через комьюнити.

Следующие шаги после освоения SQL:

  • Углубите знания одной СУБД: станьте экспертом PostgreSQL или MS SQL Server
  • Изучите Python для аналитики: pandas, numpy, matplotlib — стандартный стек аналитика
  • Освойте BI-инструменты: Tableau, Power BI, Metabase для визуализации
  • Изучите Git: для версионирования SQL-скриптов и совместной работы
  • Попробуйте работу с большими данными: Spark SQL, ClickHouse, BigQuery

SQL — это не финальная точка, а фундамент для карьеры в данных. С этим навыком вы можете развиваться в сторону data analyst, business intelligence analyst, analytics engineer, data engineer или даже data scientist.

Главное — начать. Установите DBeaver, подключитесь к тестовой базе, напишите первый SELECT. Через три месяца регулярной практики вы удивитесь, насколько далеко продвинулись.

📝

Проверьте себя

5 вопросов по материалу статьи

1. Что такое SQL?

2. Какой из следующих специалистов использует SQL для анализа поведения пользователей?

3. Какой тип базы данных является самым распространённым?

4. Какой из следующих языков не является языком структурированных запросов?

5. Какой медианный ежемесячный доход аналитиков данных в России в 2026 году?