SQL Formatter — инструмент для автоматического форматирования SQL запросов: расстановки отступов, переноса клауз на новые строки и приведения ключевых слов к UPPERCASE. Читаемый SQL проще отлаживать, проверять в code review и передавать коллегам.
Для быстрого форматирования используйте SQL Formatter на reChecker.
Зачем форматировать SQL
Неотформатированный запрос:
select u.id,u.name,o.total from users u inner join orders o on u.id=o.user_id where o.status='completed' and o.total>100 order by o.total desc limit 10
Тот же запрос после форматирования:
SELECT
u.id,
u.name,
o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed'
AND o.total > 100
ORDER BY o.total DESC
LIMIT 10;
Разница очевидна: структура видна с первого взгляда, условия WHERE читаются как список, JOIN легко найти в длинном запросе.
Правила форматирования SQL
1. Ключевые слова в UPPERCASE
Стандарт SQL не требует верхнего регистра, но это общепринятое соглашение. Ключевые слова SELECT, FROM, WHERE, JOIN, AND, OR — всегда в верхнем регистре. Имена таблиц, колонок, псевдонимы — в нижнем или camelCase по соглашению проекта.
-- Плохо
select id, name from users where active = 1
-- Хорошо
SELECT id, name FROM users WHERE active = 1
2. Каждая клауза на отдельной строке
Начинайте SELECT, FROM, WHERE, JOIN, GROUP BY, ORDER BY, HAVING, LIMIT с новой строки:
SELECT
id,
name,
email
FROM users
WHERE active = 1
ORDER BY created_at DESC
LIMIT 20;
3. Колонки SELECT — одна на строку
При выборе нескольких колонок каждая идёт с отдельной строкой и отступом. Запятая — в конце или в начале строки (в конце удобнее):
SELECT
user_id,
product_id,
quantity,
price,
created_at
FROM order_items;
4. Условия WHERE с отступом
Каждый AND / OR — на новой строке с отступом:
WHERE
status = 'active'
AND created_at > '2026-01-01'
AND (category = 'SEO' OR category = 'Dev')
5. JOIN — на отдельной строке
Каждый JOIN и его условие ON — на отдельных строках:
FROM orders o
INNER JOIN users u ON o.user_id = u.id
LEFT JOIN products p ON o.product_id = p.id
6. Подзапросы — с дополнительным отступом
SELECT
id,
name,
(
SELECT COUNT(*)
FROM orders
WHERE orders.user_id = users.id
) AS order_count
FROM users;
7. Псевдонимы — через AS
Явное AS делает запрос читаемее, хотя синтаксически необязательно:
-- Хорошо
SELECT u.name AS user_name, COUNT(o.id) AS order_count
FROM users AS u
LEFT JOIN orders AS o ON u.id = o.user_id
8. Точка с запятой в конце
Завершайте запросы ;. Это обязательно для выполнения нескольких запросов подряд и хорошая привычка в целом.
Размер отступа
Стандарта нет, но 2 или 4 пробела — наиболее распространённые варианты. Табуляция используется реже. Главное — единообразие внутри проекта.
Минификация SQL
Минифицированный SQL — это запрос без лишних пробелов и переносов. Используется:
- в логах, где важен компактный вид
- при передаче через API или URL
- в конфигурационных файлах
-- Оригинал (4 строки)
SELECT id, name
FROM users
WHERE active = 1
LIMIT 10;
-- Минифицированный (1 строка)
SELECT id,name FROM users WHERE active=1 LIMIT 10;
Инструменты форматирования
Онлайн
SQL Formatter на reChecker — форматирует и минифицирует SQL в браузере. Данные не отправляются на сервер.
VS Code
Расширения SQL Formatter (по поиску в Extensions) форматируют SQL при сохранении файла или по горячей клавише Shift+Alt+F.
DBeaver и DataGrip
Встроенное форматирование SQL: Ctrl+Shift+F (DBeaver) или Ctrl+Alt+L (DataGrip).
Библиотека sql-formatter (Node.js)
import { format } from 'sql-formatter';
const formatted = format(
`select id,name from users where active=1`,
{ language: 'postgresql', tabWidth: 2 }
);
console.log(formatted);
Диалекты SQL
Синтаксис отличается между:
| Диалект | СУБД | Особенности |
|---|---|---|
| MySQL | MySQL, MariaDB | Обратные кавычки для имён, LIMIT/OFFSET |
| PostgreSQL | PostgreSQL | ILIKE, оконные функции, :: для кастинга |
| T-SQL | SQL Server | TOP n, GETDATE(), NOLOCK |
| PL/SQL | Oracle | ROWNUM, CONNECT BY, NVL |
| SQLite | SQLite | Простой диалект, без RIGHT JOIN до 2021 |
Стандартный форматтер работает с универсальным SQL. Диалектные расширения форматируются как обычный текст.
Примеры сложных запросов
GROUP BY с HAVING
SELECT
category,
COUNT(*) AS product_count,
AVG(price) AS avg_price
FROM products
WHERE active = 1
GROUP BY category
HAVING COUNT(*) > 10
ORDER BY avg_price DESC;
CTE (Common Table Expression)
WITH active_users AS (
SELECT id, name, email
FROM users
WHERE status = 'active'
AND last_login > NOW() - INTERVAL '30 days'
),
user_orders AS (
SELECT
user_id,
COUNT(*) AS order_count,
SUM(total) AS total_spent
FROM orders
GROUP BY user_id
)
SELECT
u.name,
u.email,
COALESCE(o.order_count, 0) AS orders,
COALESCE(o.total_spent, 0) AS spent
FROM active_users u
LEFT JOIN user_orders o ON u.id = o.user_id
ORDER BY spent DESC
LIMIT 100;
CASE WHEN
SELECT
id,
name,
CASE
WHEN score >= 90 THEN 'Отлично'
WHEN score >= 70 THEN 'Хорошо'
WHEN score >= 50 THEN 'Удовлетворительно'
ELSE 'Неудовлетворительно'
END AS grade
FROM students
ORDER BY score DESC;
Рекомендации
- Единый стиль в проекте — договоритесь о соглашениях (UPPER/lower, позиция запятой, размер отступа) и зафиксируйте в README или
.editorconfig. - Форматируйте перед code review — нечитаемый SQL труднее проверять.
- Комментируйте сложные запросы —
-- Запрос получает активных пользователей с заказами за последние 30 дней. - Используйте псевдонимы — длинные имена таблиц сокращайте
AS u,AS o. - Разбивайте сложные запросы — CTE вместо глубоко вложенных подзапросов.
Заключение
Форматированный SQL — признак профессионализма. Он облегчает отладку, code review и совместную работу. Используйте SQL Formatter для быстрого форматирования без установки инструментов.