В этой статье мы разберём, как написать ваш первый SQL-запрос. Не пугайтесь аббревиатур и сложных терминов. SQL — это всего лишь язык общения с базой данных, и вы удивитесь, насколько он логичен и похож на обычную человеческую речь.
Что такое SQL и зачем он вам нужен?
SQL (Structured Query Language) — это стандартный язык для работы с реляционными базами данных. Если представить базу данных как большой склад с полками, то SQL — это язык, на котором вы даёте команды кладовщику: «принеси то», «положи это», «пересчитай вон те коробки».
Зачем вам это как аналитику? Без SQL вы зависимы от готовых отчётов и других специалистов. С SQL вы получаете прямую власть над данными: можете самостоятельно отвечать на бизнес-вопросы, проверять гипотезы и находить инсайты.
Шаг 1: понимание структуры данных
Прежде чем писать запрос, нужно понять, с какими таблицами мы работаем. Представьте, что вы пришли в библиотеку — сначала вы смотрите на каталог, чтобы понять, где что находится.
Здесь будут важны основные понятия в SQL:
- Таблица — лист Excel с данными (например,
employees,orders,products); - Столбец — поле данных (например,
first_name,salary,order_date); - Строка — одна запись в таблице (например, данные одного сотрудника).
Самый полезный запрос для начала:
SELECT * FROM employees LIMIT 10;
Этот запрос означает: «Покажи мне все столбцы из таблицы employees, но только первые 10 строк». Это ваш лучший друг для разведки данных.
Использование LIMIT — это не обязательный атрибут, но это хороший тон, который снижает нагрузку на базу данных, поэтому старайтесь использовать его при исследовании данных.
Шаг 2: основная структура SQL-запроса
Запрос SQL состоит из предложений, которые идут в строгом порядке:
SELECT— какие столбцы выбрать;FROM— из какой таблицы;WHERE— условия фильтрации;GROUP BY— группировка для агрегации данных по столбцу/столбцам;HAVING— фильтрация после группировки;ORDER BY— сортировка полученного результата;LIMIT— ограничение количества строк.
Важно! Порядок написания НЕ совпадает с порядком выполнения. База данных сначала смотрит на FROM, потом WHERE, потом SELECT и т. д. Об этом я подробно писал в предыдущей статье.
Шаг 3: ваш первый осмысленный запрос
Прежде чем писать запрос, вам нужно сформировать цель, ответив на вопрос: «Что я хочу найти с помощью этого запроса?»
Давайте решим реальную бизнес-задачу. Ваш вопрос будет звучать так: «Найди все автомобили, которые были проданы в Москве в 2025 году с мощностью двигателя более 150 л. с.».
Разберём осмысленно:
- Нам нужны данные из таблицы продаж автомобилей (предположим,
car_sales); - Нас интересуют только продажи города Москва (
sales_city = 'Moscow'); - Автомобили с мощностью двигателя более 150 л. с. (
engine_capacity > 150); - Продажа была в 2025 году (
sales_date >= date'2025-01-01'); - Мы хотим видеть их дату продажи, марку, модель и мощность двигателя.
Переводим на SQL:
SELECT
sales_date,
brand,
model,
engine_capacity
FROM car_sales
WHERE sales_city = 'Moscow'
AND engine_capacity > 150
AND sales_date >= date'2025-01-01';
Поздравляю! Вы только что написали свой первый осмысленный бизнес-запрос!
Шаг 4: осваиваем фильтрацию (WHERE)
Условия WHERE — это ваш основной инструмент для точного поиска. Используйте его так часто, как только можете — это позволит сделать ваши скрипты быстрее.
Вот самые частые операторы и примерами фильтрации:
- Точное совпадение/несовпадение:
WHERE sales_city = 'Moscow' или WHERE sales_city != 'Moscow'
- Числовые диапазоны:
WHERE engine_capacity BETWEEN 150 AND 250 или WHERE engine_capacity >= 150 and engine_capacity <= 250
- Поиск по шаблону:
WHERE lower(brand) LIKE '%maz%' или WHERE lower(brand) NOT LIKE '%maz%'
- Несколько возможных значений:
WHERE sales_city IN ('Moscow', 'Perm', 'Kazan') или WHERE sales_city NOT IN ('Moscow', 'Perm', 'Kazan')
- Работа с датами:
WHERE sales_date >= date'2025-01-01'
Шаг 5: сортировка результатов (ORDER BY)
Часто данные нужно упорядочить для удобства анализа:
- Простая сортировка по мощности двигателя (по возрастанию):
SELECT brand, model, engine_capacity
FROM car_sales
ORDER BY engine_capacity;
- Сортировка по убыванию:
SELECT brand, model, engine_capacity
FROM car_sales
ORDER BY engine_capacity DESC;
- Сложная сортировка — сначала по марке, потом по модели:
SELECT brand, model, engine_capacity
FROM car_sales
ORDER BY brand, model;
- Разносторонняя сортировка:
SELECT brand, model, engine_capacity
FROM car_sales
ORDER BY brand ASC, model DESC;
Также наименование столбца в ORDER BY можно заменить на цифры, например:
SELECT brand, model, engine_capacity
FROM car_sales
ORDER BY 1, 2;
При формировании постоянных запросов в виде процедур, не забывайте удалять ORDER BY, особенно на больших массивах данных, так как он сильно нагружает БД.
Шаг 6: агрегация данных (GROUP BY)
Иногда нужно не просто выбрать данные, а посчитать статистику. Например, среднюю мощность двигателя по маркам:
SELECT
brand,
AVG(engine_capacity) as avg_engine_capacity,
COUNT(distinct model) as model_count
FROM car_sales
GROUP BY brand;
Что здесь происходит:
GROUP BY brand— группируем все автомобили по брендам;AVG(engine_capacity)— считаем среднюю мощность двигателя в каждой группе;COUNT(distinct model)— считаем количество уникальных моделей в каждом бренде;as avg_engine_capacity— даём понятное имя столбцу с результатом.
Шаг 7: объединение таблиц (JOIN)
Реальные данные почти всегда разбросаны по нескольким таблицам. Зачастую, чтобы решить реальный кейс, приходится объединять по 5-10 таблиц, поэтому не бойтесь JOIN’ов — это ваши самые главные помощники.
Например, давайте найдём все автомобили и год их выпуска:
SELECT
s.brand,
s.model,
c.manufacture_dt
FROM car_sales s
JOIN cars c ON s.car_id = c.car_id;
Разберём синтаксис:
car_sales s— даём таблице псевдоним 's' для удобства;JOIN cars c— присоединяем таблицуcar_salesс псевдонимом 'c';ON s.car_id = c.car_id— условие связи между таблицами.
В итоге мы получили необходимый результат из двух различных таблиц.
Практический пример от начала до конца
Бизнес-задача: «Найти топ-10 самых продаваемых автомобилей за текущий месяц».
Прежде чем прочитать запрос, попробуйте мысленно разложить его, как мы сделали в шаге 3. Если получилось, то проверьте себя:
SELECT
d.model,
SUM(p.quantity) as total_sold,
SUM(p.quantity * p.unit_price) as total_revenue
FROM car_dict d
JOIN car_procapp p ON d.id= p.car_id
WHERE p.procapp_date >= trunc(sysdate, 'mm')
AND p.status = 'completed'
GROUP BY d.model
ORDER BY total_sold DESC
LIMIT 10;
Что мы сделали:
- Соединили 2 таблицы — справочник автомобилей и заявки;
- Отфильтровали за текущий месяц и отобрали только завершённые заявки;
- Сгруппировали по модели автомобиля;
- Посчитали общее количество и выручку;
- Отсортировали по продаваемости и взяли топ-10.
Частые ошибки новичков и как их избежать
Как говорится, кто не ошибается, тот ничего не делает. Поэтому не бойтесь совершать ошибки, но после каждой ошибки анализируйте её и извлекайте мысль, как сделать так, чтобы больше не повторить эту ошибку.
Ошибка 1: путаница с кавычками
Неправильно (числа без кавычек, текст в одинарных):
WHERE engine_capacity > "150" AND model = "Mazda"
Правильно:
WHERE engine_capacity > 150 AND model = 'Mazda'
Ошибка 2: забыли GROUP BY при агрегации
Неправильно:
SELECT model, AVG(quantity) as avg_quaninity
FROM car_sales; -- ОШИБКА!
Правильно:
SELECT model, AVG(quantity) as avg_quanitity
FROM car_sales
GROUP BY model;
Ошибка 3: поставили GROUP BY не по тому полю или оставили излишние GROUP BY
Неправильно:
SELECT model, AVG(engine_capacity) as avg_engine_capacity
FROM car_sales
GROUP BY brand; -- ОШИБКА!
Правильно:
SELECT model, AVG(engine_capacity) as avg_engine_capacity
FROM car_sales
GROUP BY model;
Ошибка 4: путаница с WHERE и HAVING
WHERE фильтрует ДО группировки:
SELECT model, AVG(engine_capacity) as avg_engine_capacity
FROM car_sales
WHERE engine_capacity > 150 -- фильтруем строки
GROUP BY model;
HAVING фильтрует ПОСЛЕ группировки:
SELECT model, AVG(engine_capacity) as avg_engine_capacity
FROM car_sales
GROUP BY model
HAVING AVG(engine_capacity) > 150; -- фильтруем группы
Лучшие практики с первого дня
Часто бывает так, что мы решаем задачу, потом через полгода возвращаемся к ней и нам важно быстро разобраться в коде, который сами же написали. И если вам тяжело его понять, то каково другому человеку, который доделывает вашу задачу во время вашего отпуска? Поэтому старайтесь придерживаться следующих правил:
- Пишите читабельный код. Плохо:
select brand, model, engine_capacity from employees where brand = ‘Mazda’ and engine_capacity > 150;
Хорошо:
SELECT
brand,
model,
engine_capacity
FROM employees
WHERE brand = 'Mazda'
AND engine_capacity > 150;
- Комментируйте сложную логику:
-- Находим автомобили с аномально высокой мощностью двигателя для их должности
или
/*-- Находим автомобили с аномально высокой мощностью двигателя для их должности */
SELECT car_id, engine_capacity, model
FROM car_sales s
WHERE engine_capacity > (
SELECT AVG(engine_capacity) * 1.5
FROM car_sales s2
WHERE s2.model = s.model
);
- Всегда проверяйте сначала на маленьком наборе данных. Это в большей степени про уважение к своим коллегам. Если ваш запрос нагружает базу данных, то от этого страдают ваши коллеги, которые не могут в срок выполнить свою задачу.
Сначала посмотрим на структуру:
SELECT * FROM large_table LIMIT 5;
Потом считаем, сколько строк попадает под условие:
SELECT COUNT(*) FROM large_table WHERE your_conditions;
И только потом делаем полный запрос.
Что делать дальше?
Вот мы и написали свой первый запрос, но что же делать дальше?
- Практика, практика и еще раз практика — решайте реальные бизнес-задачи.
- Изучайте конкретные функции вашей СУБД (PostgreSQL, MySQL, etc.).
- Осваивайте оконные функции для продвинутой аналитики.
- Учитесь читать EXPLAIN PLAN для оптимизации запросов.
Помните: каждый senior-аналитик когда-то написал свой первый запрос. Главное — начать и не бояться ошибок. Ваш первый запрос — это как первые шаги: сначала неуверенно, но с каждой практикой всё увереннее.
Добро пожаловать в мир данных! Теперь у вас есть ключ к тому, чтобы задавать правильные вопросы и получать на них точные ответы.
