Отформатируйте SQL-запрос онлайн: отступы 2 или 4 пробела, регистр ключевых слов, переносы перед SELECT и JOIN, разбивка AND и OR, минификация в одну строку.
Форматирование расставляет переносы и отступы, минификация собирает запрос в одну строку
Сколько добавлять на каждый уровень вложенности: подзапрос и перенесённое условие
Строки, комментарии и имена в кавычках регистр не меняют
Как переносить длинный список колонок или условий
Какие кавычки считать именем, а какие строкой. На обычный запрос выбор не влияет
SQL пишут и читают в разных условиях. Запрос, собранный в коде приложения из кусков и подставленных значений, — это одна длинная строка, в которой WHERE теряется где-то на середине. Запрос из клиента базы приходит с переносами, но своего оформления, и в ревью такой файл читается тяжело. Привести текст к одному виду нужно в двух случаях: чтобы его понял человек и чтобы в системе контроля версий диффы показывали смысл правки, а не перестановку пробелов. Форматирование и минификация — это перевод одного и того же запроса в запись, которая нужна сейчас: читаемую для разбора или компактную для логов, конфигов и однострочных вызовов.
Формально переставить пробелы легко, но запрос — не просто текст. Внутри строкового литерала может стоять слово select, и такой кусок нельзя ни разбивать, ни менять ему регистр: это данные. Комментарий «--» действует до конца строки, а «/* */» — до закрывающей пары, причём в PostgreSQL и MS SQL блочные комментарии вкладываются друг в друга. В PostgreSQL есть dollar-quoting: текст между «$$» или «$tag$…$tag$» — одна строка, внутри которой кавычки удваивать не нужно. Наконец, правила кавычек в диалектах расходятся: в MySQL обратные кавычки означают имя, а двойные — строку; в MS SQL имя выделяют квадратными скобками. Инструмент разбирает вход на токены и по каждому решает, код это или данные, поэтому переписывается только код. Если разобрать текст нельзя — не закрыта кавычка, комментарий, dollar-строка или скобка, — об этом сообщается с номером строки, позицией и смещением, вместо молчаливо испорченного результата.
Ничего не отправляется наружу: разбор и запись выполняет код страницы в браузере, запрос не уходит по сети и не сохраняется на сервере. Это не формальность: в SQL постоянно встречаются имена таблиц и колонок, названия компаний, образцы строк из продакшена, а схема базы сама по себе — сведения, которыми не хочется делиться. При этом инструмент только переписывает текст: он не подключается к базе, не проверяет существование таблиц, не оценивает план выполнения и не проверяет права. Его задача — оформление, а смысл запроса и его корректность остаются за автором.
Вставьте запрос в поле ввода — он переписывается сразу, по мере набора, кнопки «Обработать» нет. Инструмент сам ставит перенос перед SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, UNION, INSERT INTO, VALUES, UPDATE и DELETE, делает отступ для подзапросов в скобках и приводит ключевые слова к выбранному регистру. Настроек семь: режим, отступ, регистр, положение запятой, диалект, разбивка AND и OR, сохранение комментариев. Готовый текст копируется кнопкой, а кнопка «В исходник» возвращает результат в поле ввода — так удобно форматировать запрос в несколько проходов. Отдельного ограничения на размер нет: разбор идёт в браузере, поэтому упор — только в память устройства. На запросе в 2000 колонок (около 36 КБ, 8000 токенов) результат пересчитывается мгновенно.
Нет. Разбор и форматирование выполняет код страницы прямо в браузере: текст не уходит по сети, не сохраняется на сервере и не попадает в логи. Это важно, когда в запросе есть имена таблиц и колонок, названия компаний, образцы строк из продакшена или фрагменты персональных данных — схема базы сама по себе сведения, которыми не хочется делиться. Сеть не нужна совсем: страница считается локально, поэтому инструмент работает и при отключённом соединении.
Потому что это данные, а не код. Литерал вроде '%select from where%' должен остаться ровно таким, каким его записали: если разбить его на строки или сменить в нём регистр, запрос начнёт искать другой текст. Поэтому инструмент сначала разбирает ввод на токены и отличает строку от кода, а переносы и регистр применяет только к коду. Так же не трогаются комментарии и имена в кавычках: SELECT внутри строки остаётся как есть, а слово from в комментарии не превращается в отдельную строку.
Значит, в тексте не закрыта какая-то конструкция: одинарная кавычка, блочный комментарий /* */, dollar-строка или скобка. Инструмент называет номер строки, позицию в строке и смещение от начала, показывает саму строку и место в ней. Сообщается первая проблема по порядку текста: после исправления разбор пойдёт дальше и может найти следующую. Такой текст не форматируется намеренно — незакрытая кавычка превратила бы в строку весь остаток запроса, и на выходе получился бы другой запрос с испорченными данными.
Правила кавычек и комментариев. В PostgreSQL двойные кавычки — имя, а не строка, и есть dollar-quoting «$$…$$», внутри которого кавычки удваивать не нужно. В MySQL имя выделяют обратные кавычки, строка пишется в двойных, а «#» начинает комментарий до конца строки. В MS SQL имя выделяют квадратные скобки. В SQLite именем считаются все три вида кавычек. В Oracle двойные кавычки — имя. Блочные комментарии вкладываются друг в друга в PostgreSQL и MS SQL и не вкладываются в трёх остальных диалектах. На обычный запрос выбор почти не влияет: разница видна там, где встречаются обратные кавычки, квадратные скобки, «#» или dollar-строки.
Переключите режим на «В одну строку». Запрос соберётся без переносов и лишних пробелов, а пробел останется только там, где без него склеятся соседние токены: «SELECT a FROM t» не превратится в «SELECTaFROMt». Комментарий «--» при этом убрать нельзя: он действует до конца строки, поэтому после него перенос обязателен, иначе комментарий поглотит остаток запроса. Если комментарии в одну строку не нужны совсем, снимите флажок «Сохранять комментарии» — тогда они вырезаются вместе с переносами.
В этом режиме ключевые слова остаются такими, какими их набрали, а переносы, отступы и запятые всё равно расставляются. ВЕРХНИЙ регистр — привычная запись в документации и в разборе чужих запросов, нижний встречается в коде приложений и в генераторах. Полезно знать побочный эффект: смена регистра задевает любое слово, совпавшее с ключевым, поэтому колонку с именем «key» или «row» режим «ВЕРХНИЙ» запишет как KEY или ROW — отличить такое имя от ключевого слова без знания схемы нельзя. Для ключевых слов регистр в SQL не значим, а вот имя, записанное в двойных кавычках, инструмент не трогает вообще.