SQL код скопирован в буфер обмена
EN PT FR

Урок 10.1 · Время чтения: ~9 мин

Этот урок посвящен основам написания качественного SQL-кода, который легко читать и поддерживать. Вы узнаете о стандартах форматирования, правилах именования объектов и использовании комментариев. Мы разберем, как сделать сложные запросы понятными для коллег и самих себя в будущем. К концу урока вы сможете оформлять свои SQL-скрипты профессионально и эффективно.

Урок 10.1: Лучшие практики читаемости и поддержки кода

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

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

Сравнение неструктурированного и хорошо отформатированного SQL-запроса с акцентом на читаемость


Зачем заботиться о стиле кода

Когда запрос состоит из 5–10 строк, его логика обычно понятна с первого взгляда. Но когда вы переходите к сложным отчетам с множеством JOIN, подзапросов или CTE, код может стать перегруженным и трудным для разбора даже для автора спустя неделю.

Следование стандартам помогает:

  • Быстрее находить ошибки: неверное условие фильтрации или забытый JOIN в чистом коде заметны сразу.
  • Масштабировать решения: структурированный код легче дополнять новыми полями или условиями.
  • Работать в команде: коллеги смогут проводить Code Review и поддерживать ваши скрипты без лишних вопросов.

Форматирование и отступы

Единый стиль форматирования — это основа читаемости. Хотя SQL не чувствителен к регистру и лишним пробелам, существуют общепринятые правила.

Регистр ключевых слов

Рекомендуется писать ключевые слова SQL (SELECT, FROM, WHERE, JOIN, GROUP BY) заглавными буквами. Это помогает визуально отделить команды СУБД от названий таблиц и столбцов.

-- Плохо
select name, price from products where category_id = 1;

-- Хорошо
SELECT name, price
FROM products
WHERE category_id = 1;

Переносы строк и отступы

Каждая основная секция запроса должна начинаться с новой строки. Если в SELECT или GROUP BY перечисляется много столбцов, лучше выносить каждый из них на отдельную строку.

SELECT 
    customer_id,
    first_name,
    last_name,
    email
FROM customer
WHERE active = 1
ORDER BY last_name;

Соглашения об именовании

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

Использование нижнего регистра (snake_case)

В мире SQL стандартом де-факто является использование нижнего регистра и подчеркиваний для разделения слов. Это связано с тем, что многие СУБД по умолчанию приводят имена к нижнему (PostgreSQL) или верхнему (Oracle) регистру, что может вызвать путаницу при использовании CamelCase.

  • Плохо: CustomerOrders, TotalAmount
  • Хорошо: customer_orders, total_amount

Венгерская нотация и префиксы

Иногда для упрощения навигации по базе данных используют префиксы, указывающие на тип объекта (элемент венгерской нотации). Это помогает сразу понять, с чем вы работаете в коде.

Примеры префиксов:

  • v_ для представлений (view): v_active_customers
  • tmp_ для временных таблиц: tmp_monthly_report
  • t_ для обычных таблиц (используется реже)
-- Сразу понятно, что данные берутся из подготовленного представления
SELECT * 
FROM v_customer_payment_summary
WHERE total_amount > 100;

Именование и алиасы

Понятные названия и сокращения (алиасы) делают запрос «самодокументированным».

Очевидные алиасы таблиц

Используйте короткие, но понятные сокращения для таблиц, особенно при использовании JOIN. Избегайте алиасов типа t1, t2, a, b.

-- Непонятно
SELECT 
    t1.name, 
    t2.amount
FROM table_a t1
JOIN table_b t2 ON t1.id = t2.ref_id;

-- Понятно
SELECT 
    c.first_name, 
    p.amount
FROM customer c
JOIN payment p ON c.customer_id = p.customer_id;

Понятные алиасы вычисляемых полей

Всегда давайте осмысленные имена агрегатным функциям и вычисляемым столбцам. Результат запроса с колонкой count(*) выглядит непрофессионально в отчете.

SELECT 
    category_id,
    COUNT(*) AS total_films_in_category,
    AVG(replacement_cost) AS average_replacement_cost
FROM film
GROUP BY category_id;

Комментирование кода

Комментарии объясняют почему написан тот или иной кусок кода, если логика неочевидна.

  • Однострочные комментарии (--): используйте для пояснения конкретных условий или формул.
  • Многострочные комментарии (/* ... */): используйте в начале скрипта для описания его назначения, автора и даты создания.
/*
  Скрипт: Расчет активных клиентов за месяц
  Автор: Иванов И.
  Дата: 2026-04-16
*/

SELECT 
    customer_id,
    SUM(amount) AS monthly_spent
FROM payment
WHERE payment_date >= '2026-01-01' -- Фильтр с начала года
  AND payment_date < '2026-02-01'
GROUP BY customer_id;

Практический пример: приведение «грязного» кода в порядок

Давайте посмотрим, как преображается реальный запрос после применения правил читаемости.

До (сложно читать):

select f.title,c.name,count(r.rental_id) from film f join film_category fc on f.film_id=fc.film_id join category c on fc.category_id=c.category_id join inventory i on f.film_id=i.film_id join rental r on i.inventory_id=r.inventory_id group by f.title,c.name having count(r.rental_id)>30 order by count(r.rental_id) desc;

После (легко поддерживать):

SELECT 
    f.title,
    c.name AS category_name,
    COUNT(r.rental_id) AS rental_count
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c       ON fc.category_id = c.category_id
JOIN inventory i      ON f.film_id = i.film_id
JOIN rental r         ON i.inventory_id = r.inventory_id
GROUP BY f.title, c.name
HAVING COUNT(r.rental_id) > 30
ORDER BY rental_count DESC;

Примечание: во втором варианте сразу видна структура связей, названия агрегатов и условия фильтрации.


Ключевые выводы этого урока:

  • Пишите ключевые слова SQL заглавными буквами, чтобы визуально отделять структуру запроса.
  • Используйте переносы строк и отступы, чтобы длинные запросы было проще читать и проверять.
  • Давайте таблицам и вычисляемым полям понятные алиасы вместо абстрактных сокращений.
  • Применяйте единые правила именования, например snake_case (нижний регистр и подчеркивания), для таблиц и столбцов.
  • Комментируйте неочевидную бизнес-логику и сложные условия фильтрации.
  • Поддерживайте единый стиль в команде, чтобы ускорять ревью, отладку и развитие кода.

Часто задаваемые вопросы

Нужно ли всегда писать ключевые слова SQL в верхнем регистре?

Строго технической необходимости нет: СУБД поймет запрос и в нижнем регистре. Но единый стиль с SELECT, FROM, WHERE, JOIN в верхнем регистре повышает читаемость и ускоряет проверку длинных запросов.

Когда комментарии в SQL действительно нужны?

Комментарии особенно полезны там, где логика неочевидна: бизнес-правила, нестандартные фильтры, технические ограничения. Если код и так очевиден, избыточные комментарии лучше не добавлять.

Что важнее для поддержки: форматирование или именование?

Оба аспекта критичны. Форматирование помогает быстро увидеть структуру запроса, а понятные имена таблиц, алиасов и вычисляемых полей делают смысл запроса очевидным без дополнительных пояснений.

Вопросы для собеседования

Какие признаки отличают поддерживаемый SQL-код?

Поддерживаемый SQL-код имеет единый стиль форматирования, понятные имена объектов, аккуратные алиасы и осмысленные комментарии в сложных местах. Такой код проще проверять, изменять и сопровождать в команде.

Почему плохое именование в SQL может стать проблемой для команды?

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

Как бы вы улучшили «грязный» SQL-запрос на практике?

Сначала разделил бы запрос на логические блоки (SELECT, FROM, JOIN, WHERE, GROUP BY, ORDER BY) с переносами строк и отступами. Затем заменил бы неясные алиасы, добавил осмысленные имена агрегатов и, при необходимости, краткие комментарии к неочевидной логике.

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

Урок 10.2: Написание эффективных SQL-запросов