Перейти к содержимому
Учи.Онлайн Выбрать школу
Статья

SQL: что это, где применяется и как освоить

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

Автор: редакция Учи.ОнлайнОтветственный редактор: Дмитрий Игнатьев
Содержание
Иллюстрация к статье: SQL

Навык недооценивают с двух сторон. Одни считают SQL языком программистов и ждут выгрузку от аналитика, хотя простой запрос читается почти как фраза: «выбери имя и город из таблицы клиентов, где город — Казань». Другие, выучив SELECT за вечер, отправляют руководителю непроверенные цифры. Второй путь опаснее: синтаксическую ошибку база покажет сразу, а запрос, который считает не то, спокойно выдаст правдоподобное число.

Какую задачу решает SQL и когда он не нужен

SQL нужен, когда данные уже лежат в базе, а вопрос к ним не предусмотрен готовым отчётом. Маркетолог хочет знать, сколько клиентов, пришедших по весенней акции, сделали второй заказ. Продакт проверяет, сколько пользователей открыли новый экран и вернулись через неделю. Финансист ищет оплаты, к которым не нашлось счёта. Тестировщик после нажатия кнопки «Отменить заказ» смотрит, поменялся ли статус в таблице заказов и не осталась ли резервная запись на складе. Во всех случаях человек сам формулирует вопрос и сам получает ответ, не вставая в очередь к аналитикам.

Бывает, что SQL не лучший выбор. Одну выгрузку на пару тысяч строк быстрее разобрать в Excel. Если показатель уже есть на дашборде в BI-системе, свой запрос только создаст вторую версию той же цифры. Для статистики и прогнозов SQL подготовит данные, а считать удобнее в Python. И без доступа к базе навык бесполезен: для отчётов администраторы обычно дают доступ только на чтение, к копии базы или отдельной схеме.

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

Учебный пример: кто купил после рассылки

Ситуация учебная. В базе интернет-магазина три таблицы: clients (клиенты), mailings (кому и когда ушло письмо) и orders (заказы с датой, суммой и номером клиента). Маркетолог хочет узнать, сколько получателей августовской рассылки сделали заказ в течение семи дней после письма и на какую сумму.

SELECT COUNT(DISTINCT m.client_id) AS buyers,
       SUM(o.amount) AS revenue
FROM mailings m
JOIN orders o
  ON o.client_id = m.client_id
 AND o.created_at >= m.sent_at
 AND o.created_at < m.sent_at + INTERVAL '7 days'
WHERE m.campaign = 'august_sale';

Запрос соединяет письма с заказами того же клиента в окне семи дней и считает уникальных покупателей и выручку. Уже здесь легко ошибиться. Если клиент получил два письма одной кампании, его заказ попадёт в соединение дважды и выручка удвоится, хотя число покупателей благодаря DISTINCT останется верным. А вывод «рассылка принесла столько-то» из запроса не следует: часть людей купила бы и без письма, и для оценки эффекта нужна группа без рассылки — это уже вопрос анализа данных.

Где запрос ошибается без предупреждения

Следующий вопрос маркетолога кажется ещё проще: кто из клиентов ни разу не делал заказ? Первое, что приходит в голову, — условие NOT IN:

SELECT id, email FROM clients
WHERE id NOT IN (SELECT client_id FROM orders);

Допустим, магазин разрешает гостевые заказы без регистрации, и у таких строк в orders поле client_id пустое, то есть NULL. Тогда запрос вернёт ноль строк, хотя клиентов без заказов могут быть тысячи. Это не сбой, а поведение, прописанное в стандарте. В документации PostgreSQL, раздел 9.24.3 о конструкции NOT IN, сказано: если равных значений справа нет, а хотя бы одна строка подзапроса даёт NULL, результат NOT IN будет NULL, а не «истина». Условие WHERE оставляет только строки, для которых условие истинно, поэтому NULL отбрасывает каждого клиента. База не выдаёт ни ошибки, ни предупреждения: маркетолог видит пустую таблицу и решает, что все клиенты хоть раз покупали.

Сообщество PostgreSQL вынесло этот случай в вики-страницу «Don't Do This» с прямой рекомендацией писать вместо NOT IN с подзапросом конструкцию NOT EXISTS. Там же названа вторая причина: такой NOT IN планировщик не умеет превращать в антисоединение, и на больших таблицах запрос может замедлиться на порядки. Правильный вариант выглядит так:

SELECT c.id, c.email FROM clients c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.client_id = c.id);

Отсюда привычка: перед запросом проверьте, есть ли пустые значения в столбцах, по которым фильтруете и соединяете. Тот же NULL незаметно выпадает из COUNT(столбец) и из условия «город <> 'Москва'».

В каком порядке осваивать SQL

Порядок шагов важен, потому что каждая следующая конструкция опирается на предыдущую. Соединения бессмысленны, пока вы не понимаете, что такое строка и ключ; группировка без понимания соединений даёт удвоенные суммы; оконные функции проще выучить, когда группировка уже привычна. Поэтому разумно двигаться от чтения одной таблицы к связям и только потом к сложным расчётам.

  1. Устройство таблиц: строки, столбцы, типы данных, первичный и внешний ключи, что такое NULL.
  2. Выборка из одной таблицы: SELECT, WHERE, ORDER BY, LIMIT, работа с датами и текстом.
  3. Агрегаты и группировка: COUNT, SUM, AVG, GROUP BY и HAVING.
  4. Соединения: JOIN и LEFT JOIN, проверка числа строк до и после соединения.
  5. Подзапросы, EXISTS и NOT EXISTS, табличные выражения WITH для длинных запросов.
  6. Оконные функции: нарастающий итог, ранжирование, сравнение с предыдущим периодом.

Попробовать можно бесплатно: установите PostgreSQL и графический клиент DBeaver, загрузите открытый учебный набор данных и задавайте вопросы, ответ на которые знаете заранее. Если удобнее решать задачи в браузере без установки, подойдёт бесплатный «Симулятор SQL» от Karpov.Courses: по описанию на Учи.Онлайн, это 150 задач на PostgreSQL, от базовых запросов до продуктовых метрик на данных сервиса доставки, с визуализацией в Redash и сертификатом по итогам.

Упражнения и самопроверка

Лучший тренажёр — собственные рабочие вопросы, но начинать стоит с задач, где правильный ответ можно проверить. Посчитайте в учебной базе число заказов за месяц и сверьте его с тем, что показывает интерфейс системы. Найдите десять самых крупных клиентов и вручную проверьте двоих. Напишите запрос «клиенты без заказов» двумя способами, через LEFT JOIN с условием IS NULL и через NOT EXISTS, и убедитесь, что результаты совпадают.

Типичные ошибки новичков повторяются. Сумма после соединения больше, чем в исходной таблице, — строка размножилась. Строк в LEFT JOIN стало меньше — условие по правой таблице стоит в WHERE и превратило соединение во внутреннее. Процент нулевой — целое разделили на целое. Против всего этого помогает одна привычка: после каждого шага смотреть на число строк и на несколько строк результата глазами.

Если хочется разобрать эти темы по урокам с заданиями на каждом шаге, посмотрите онлайн-курс Бруноям «SQL для анализа данных»: в обзоре описаны 13 уроков в четырёх модулях — от выборки и фильтрации до регулярных выражений, оконных функций и изменения данных — и больше десяти практических заданий во встроенном тренажёре. Какая СУБД используется, в обзоре не сказано, это стоит уточнить у школы.

SQL в работе финансиста и тестировщика

У финансиста главная задача — сверка. Запрос соединяет выписку банка со счетами и ищет расхождения в обе стороны: оплаты без счёта и счета без оплаты. Пригодится FULL JOIN или два запроса с NOT EXISTS, а перед сравнением суммы нужно привести к одной единице: рубли в одной таблице и копейки в другой не совпадут.

Тестировщик проверяет данные за интерфейсом: кнопка сработала, но появилась ли запись, верный ли статус, нет ли дубля? Запросом же быстрее найти пользователя с нужным набором условий для теста. UPDATE и DELETE на общем стенде выполняют в транзакции, предварительно проверив условие через SELECT, иначе легко испортить данные коллегам.

Как SQL влияет на доход

Отдельной надбавки «за SQL» у маркетолога или финансиста обычно нет, и надёжной статистики о ней по этим профессиям найти не удалось. Навык меняет доход косвенно, расширяя круг задач, которые человек закрывает сам. Маркетолог, который сам считает когорты и окупаемость каналов, претендует на позиции в CRM- и аналитическом маркетинге. Менеджеру продукта умение проверить гипотезу без аналитика нужно уже на средних позициях. У тестировщика серверной части SQL скорее условие входа, чем повод для прибавки.

Проверить это на своём рынке несложно. Найдите вакансии по своей должности в своём регионе, отфильтруйте по опыту и сравните две выборки: где SQL есть в требованиях и где его нет. Смотрите медиану, отличайте суммы «до вычета» и «на руки» и помните, что это предложения работодателей, а не фактические зарплаты.

Как выбрать обучение

Для навыка, который применяется в своей работе, длинная программа профессиональной переподготовки обычно избыточна. Проверьте четыре вещи: есть ли практика на реальной СУБД, а не только тесты с выбором ответа; разбираются ли соединения, NULL и оконные функции; получите ли вы обратную связь по запросам; и работают ли задания с данными, похожими на ваши.

Тем, кому нужна короткая программа с куратором, подойдёт онлайн-курс Eduson Academy «SQL с нуля для анализа данных». По описанию на Учи.Онлайн, обучение идёт на PostgreSQL в DBeaver и рассчитано примерно на месяц: пять разделов от основ базы и условных выражений CASE и COALESCE до соединений с расчётом бизнес-метрик, подзапросов, оконных функций и передачи данных в Excel и Power BI. Итоговый проект в опубликованной программе не описан, поэтому уточните его у школы.

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

Сравнить онлайн-школы по условиям, длительности и формату можно в рейтинге онлайн-школ с обучением SQL для анализа данных. На момент проверки в нём была представлена одна программа, поэтому используйте рейтинг как отправную точку и сверяйте условия на сайтах школ.

Готовность проверить просто. Если вы можете назвать три вопроса к данным своей работы, ответы на которые сейчас ждёте от других, и знаете, у кого попросить доступ на чтение, время на SQL окупится быстро. Если таких вопросов нет, начните с бесплатного тренажёра.