В блог
Пишем свой первый SQL-запрос - IT Resume

Пишем свой первый SQL-запрос

Дата последнего обновления: 05.12.2025
Дата размещения: 05.12.2025
Евгений Буторин
Автор, редактор

В этой статье мы разберём, как написать ваш первый 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-аналитик когда-то написал свой первый запрос. Главное — начать и не бояться ошибок. Ваш первый запрос — это как первые шаги: сначала неуверенно, но с каждой практикой всё увереннее.

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

Подпишитесь на нашу рассылку
Имя*
Email*
Номер телефона*
Заполняя данную форму, Вы соглашаетесь с политикой конфиденциальности
Никакого спама. Только точечные рассылки с лучшими материалами.
  • Курсы-симуляторы
  • Авторские тренинги
  • Бесплатные курсы
  • Высшее образование