Урок 10.1 · Время чтения: ~9 мин
Этот урок посвящен основам написания качественного SQL-кода, который легко читать и поддерживать. Вы узнаете о стандартах форматирования, правилах именования объектов и использовании комментариев. Мы разберем, как сделать сложные запросы понятными для коллег и самих себя в будущем. К концу урока вы сможете оформлять свои SQL-скрипты профессионально и эффективно.
В предыдущем модуле мы изучили продвинутые инструменты работы с данными — представления и временные таблицы. Теперь, когда ваши запросы становятся все более сложными и объемными, на первый план выходит вопрос качества самого кода. В реальной разработке и аналитике SQL-код читают гораздо чаще, чем пишут.
Хорошо структурированный код снижает вероятность ошибок, упрощает процесс отладки и экономит время всей команде. Это не просто вопрос эстетики, а критически важный навык для любого SQL-разработчика или аналитика данных.
Когда запрос состоит из 5–10 строк, его логика обычно понятна с первого взгляда. Но когда вы переходите к сложным отчетам с множеством JOIN, подзапросов или CTE, код может стать перегруженным и трудным для разбора даже для автора спустя неделю.
Следование стандартам помогает:
JOIN в чистом коде заметны сразу.Единый стиль форматирования — это основа читаемости. Хотя 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;
Правильный выбор имен для таблиц, столбцов и переменных — залог того, что ваш код будет понятен без лишних слов.
В мире SQL стандартом де-факто является использование нижнего регистра и подчеркиваний для разделения слов. Это связано с тем, что многие СУБД по умолчанию приводят имена к нижнему (PostgreSQL) или верхнему (Oracle) регистру, что может вызвать путаницу при использовании CamelCase.
CustomerOrders, TotalAmountcustomer_orders, total_amountИногда для упрощения навигации по базе данных используют префиксы, указывающие на тип объекта (элемент венгерской нотации). Это помогает сразу понять, с чем вы работаете в коде.
Примеры префиксов:
v_ для представлений (view): v_active_customerstmp_ для временных таблиц: tmp_monthly_reportt_ для обычных таблиц (используется реже)-- Сразу понятно, что данные берутся из подготовленного представления
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;
Примечание: во втором варианте сразу видна структура связей, названия агрегатов и условия фильтрации.
Ключевые выводы этого урока:
snake_case (нижний регистр и подчеркивания), для таблиц и столбцов.Строго технической необходимости нет: СУБД поймет запрос и в нижнем регистре. Но единый стиль с SELECT, FROM, WHERE, JOIN в верхнем регистре повышает читаемость и ускоряет проверку длинных запросов.
Комментарии особенно полезны там, где логика неочевидна: бизнес-правила, нестандартные фильтры, технические ограничения. Если код и так очевиден, избыточные комментарии лучше не добавлять.
Оба аспекта критичны. Форматирование помогает быстро увидеть структуру запроса, а понятные имена таблиц, алиасов и вычисляемых полей делают смысл запроса очевидным без дополнительных пояснений.
Поддерживаемый SQL-код имеет единый стиль форматирования, понятные имена объектов, аккуратные алиасы и осмысленные комментарии в сложных местах. Такой код проще проверять, изменять и сопровождать в команде.
Неочевидные имена и алиасы затрудняют ревью и повышают риск ошибок при доработках. Понятные названия уменьшают когнитивную нагрузку и делают логику запроса прозрачной для всех участников проекта.
Сначала разделил бы запрос на логические блоки (SELECT, FROM, JOIN, WHERE, GROUP BY, ORDER BY) с переносами строк и отступами. Затем заменил бы неясные алиасы, добавил осмысленные имена агрегатов и, при необходимости, краткие комментарии к неочевидной логике.
В следующем уроке мы перейдем к технической стороне оптимизации и научимся писать не только красивые, но и быстрые SQL-запросы.