RunToolz iconRunToolz
Welcome to RunToolz!
SQLБаза данныхКачество кода

Читаемый SQL не опционален

Как форматировать SQL-запросы, чтобы твоё будущее я (и коллеги) не ненавидели тебя.

RunToolz Team28 января 2026 г.3 min read

Ты наследуешь запрос. Это одна строка. 400 символов. Несколько джойнов, подзапросов и CASE-выражений, всё смешано вместе.

Удачи в понимании этого.

Форматирование SQL — это не об эстетике. Это о том, поддерживаемы ли запросы.

Проблема с плотным SQL

SELECT u.id,u.name,o.total,p.name FROM users u JOIN orders o ON u.id=o.user_id JOIN products p ON o.product_id=p.id WHERE o.created_at>'2024-01-01' AND u.status='active' ORDER BY o.total DESC;

Где условие джойна? Что фильтруется? Из какой таблицы каждый столбец?

Теперь представь отладку этого в 2 часа ночи.

Хотите попробовать сами?Форматировать SQL

Тот же запрос, читаемый

SELECT
    u.id,
    u.name,
    o.total,
    p.name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id
WHERE o.created_at > '2024-01-01'
    AND u.status = 'active'
ORDER BY o.total DESC;

Каждое предложение на своей строке. Условия выровнены. Структура видна.

Правила форматирования, которые работают

Одно предложение на строку. SELECT, FROM, WHERE, ORDER BY каждое получает свою строку.

Столбцы на отдельных строках. Длинные списки SELECT становятся сканируемыми.

Отступ для продолженных условий. Несколько условий WHERE выровнены.

Ключевые слова в верхнем регистре. SELECT, FROM, WHERE выделяются от названий таблиц и столбцов.

Консистентный регистр. Выбери стиль. Придерживайся его.

Форматирование подзапросов

Подзапросы быстро становятся грязными. Отступай их чётко:

SELECT *
FROM orders
WHERE user_id IN (
    SELECT id
    FROM users
    WHERE status = 'premium'
)

Или используй CTE, когда подзапросы становятся сложными:

WITH premium_users AS (
    SELECT id
    FROM users
    WHERE status = 'premium'
)
SELECT *
FROM orders
WHERE user_id IN (SELECT id FROM premium_users)

CTE часто понятнее, чем вложенные подзапросы.

Форматирование JOIN

Всегда указывай типы джойнов. JOIN сам по себе — это INNER JOIN, но явное лучше.

SELECT *
FROM orders o
INNER JOIN users u ON o.user_id = u.id
LEFT JOIN shipping s ON o.id = s.order_id

Помещай условие джойна на ту же строку для простых джойнов. Переноси на следующую строку для сложных условий.

Что насчёт производительности?

Форматирование не влияет на выполнение. Оптимизатор базы данных не заботится о пробелах.

Но отформатированный SQL проще оптимизировать. Ты можешь видеть структуру, идентифицировать ненужные джойны, замечать отсутствующие индексы.

Нечитаемый SQL скрывает проблемы производительности.

Командные стандарты

Выбери стиль. Задокументируй его. Обеспечивай автоматизированными форматерами.

Существуют разные стили. Некоторые команды помещают запятые в начало строк. Некоторые пишут всё в верхнем регистре. Некоторые — нет.

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


Каждый запрос читается больше, чем пишется. Форматируй для читаемости. Твои коллеги — и твоё будущее я — поблагодарят тебя.