SQL форматтер и валидатор - Бесплатное онлайн форматирование SQL-запросов
Бесплатный форматтер и валидатор SQL. Автоматическое форматирование SQL с правильными отступами и капитализацией. Мгновенная проверка синтаксических ошибок. Работает с MySQL, PostgreSQL, SQL Server, Oracle.
Форматтер и валидатор SQL
Форматирование и проверка SQL-запросов с автоматическим отступом, капитализацией ключевых слов и обнаружением синтаксических ошибок.
Документация
Что такое форматировщик и валидатор SQL?
Форматировщик SQL — это инструмент, который переписывает SQL-запрос с единообразными пробелами, переносами строк и прописными ключевыми словами, чтобы его было легче читать. Валидатор SQL проверяет этот же запрос на структурные ошибки, например на незакрытую кавычку или пропущенную скобку, не подключаясь к базе данных. Этот инструмент выполняет обе задачи. Он полностью работает в браузере, поэтому текст запроса никогда не отправляется на сервер.
Как отформатировать SQL-запрос
- Вставьте или введите SQL-запрос в поле ввода.
- Отформатированная версия автоматически появляется справа, без необходимости нажимать кнопку.
- Все ошибки валидации отображаются в списке под результатом.
- Кнопка копирования отправляет отформатированный запрос в буфер обмена.
Правила форматирования SQL
Написание ключевых слов прописными буквами
Форматировщик переводит в верхний регистр фиксированный список ключевых слов SQL, если они встречаются за пределами строкового литерала или идентификатора в кавычках. В список входят основные предложения (SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, LIMIT, OFFSET), слова для соединения таблиц (JOIN, LEFT, RIGHT, INNER, OUTER, FULL, CROSS, NATURAL, ON, USING), операторы объединения множеств (UNION, INTERSECT, EXCEPT), типы операторов (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP), а также распространённые операторы и связки (AND, OR, NOT, IN, BETWEEN, LIKE, AS, CASE, WHEN, THEN, ELSE, END, ALL, DISTINCT, VALUES, SET и ещё несколько).
Некоторые слова, похожие на ключевые, остаются в исходном виде. Агрегатные функции, такие как COUNT, SUM и AVG, отсутствуют в списке, поэтому count(*) остаётся в нижнем регистре, если так было введено. Слова, обозначающие направление сортировки, ASC и DESC, а также отдельные литералы TRUE, FALSE и NULL тоже не изменяются. Текст внутри строкового литерала ('...'), идентификатора в кавычках ("...", `...` или [...]) и комментария никогда не изменяется, независимо от его содержимого.
Переносы строк и отступы
Каждое основное предложение начинается с новой строки у левого поля: SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, LIMIT и OFFSET. Соединение таблиц начинается с новой строки как единый блок, поэтому LEFT JOIN, FULL OUTER JOIN и CROSS JOIN остаются вместе, а не разделяются на две строки. Перед и после UNION и UNION ALL добавляется пустая строка, отделяющая объединяемые запросы. CASE и END начинаются с новой строки, а WHEN, THEN и ELSE — с новой строки с отступом. Каждая запятая также начинает новую строку, поэтому список столбцов в SELECT или GROUP BY располагается по одному столбцу в строке.
Отступы появляются только внутри скобок. Содержимое подзапроса или группируемого выражения получает отступ в два пробела на каждом уровне вложенности. Запрос без скобок — таких запросов большинство в повседневной работе — форматируется без отступов: каждое предложение начинается у левого поля.
Пример: до и после форматирования
До:
1select id, first_name, last_name, email from customers where status = 'active' order by last_name, first_name;
2После:
1SELECT id,
2first_name,
3last_name,
4email
5FROM customers
6WHERE status = 'active'
7ORDER BY last_name,
8first_name;
9Все ключевые слова написаны прописными буквами, а каждое предложение и каждый столбец находятся на отдельной строке. Поскольку в запросе нет скобок, ни одна строка не имеет отступа.
Скобки меняют это правило. При форматировании (select count(*) from employees e where e.department_id = d.id) как части более крупного запроса внутренние SELECT, FROM и WHERE получают отступ в два пробела, а count остаётся в нижнем регистре, поскольку это имя функции, а не ключевое слово из списка.
Что проверяет валидатор SQL
Валидатор ищет структурные проблемы без подключения к базе данных:
- Незакрытые кавычки, скобки и комментарии. Одиночная кавычка (
'), двойная кавычка ("), обратный апостроф (`), квадратная скобка ([) или блочный комментарий (/*), которые были открыты, но не закрыты. - Несбалансированные скобки. Количество
(и)за пределами строк и комментариев должно совпадать. - Подзапросы без скобок. Второй
SELECT, находящийся за пределами любых скобок, напримерSELECT * FROM SELECT id FROM t. Два запроса, соединённые оператором объединения множеств (UNION,UNION ALL,INTERSECT,EXCEPT), не помечаются как ошибочные, поскольку этим операндам скобки не нужны. То же относится к двум инструкциям, разделённым точкой с запятой. WHERE, начинающееся сANDилиOR. Связка стоит в начале, и перед ней ничего нет.JOINбез соответствующего условия. ДляJOINтребуется предложениеONилиUSING. Исключение составляютCROSS JOINиNATURAL JOIN, поскольку они такого условия не принимают.- Пустое
GROUP BYилиORDER BY. Ключевое слово предложения стоит в конце запроса, но после него нет столбцов. - Незавершённое условие
WHERE. Например, незавершённое сравнениеWHERE status =без значения или отдельноеWHEREбез последующего содержимого в конце запроса. SELECTбезFROM. Ошибка отмечается только тогда, когда список выборки состоит из простых имён столбцов. Выражение, вызов функции, литерал или функция, возвращающая значение и записанная без скобок, напримерCURRENT_DATE, допустимы сами по себе, поэтомуSELECT 1 + 1иSELECT CURRENT_DATEошибками не считаются.- Порядок предложений. Выполняются две отдельные проверки:
GROUP BYне должно находиться передWHERE, аORDER BY— передGROUP BY. Эти проверки выполняются на верхнем уровне запроса, без учёта содержимого подзапросов.
Что он не проверяет
Валидатор не знает, существуют ли таблицы или столбцы на самом деле, совместимы ли типы соединяемых столбцов и как будет выполняться запрос. Он также не выявляет все правила, которые соблюдает настоящая база данных. Два примера: использование HAVING без GROUP BY допускается, поскольку группировка всего результата в одну неявную группу разрешена в SQL, поэтому валидатор не выдаёт ошибку. Также он не проверяет, встречается ли каждый неагрегированный столбец в списке SELECT также в GROUP BY — такое правило существует в большинстве баз данных, но этот инструмент его не проверяет. Отсутствие завершающей точки с запятой тоже не считается ошибкой, поскольку точка с запятой является разделителем операторов, а не частью отдельного запроса.
Пример: ошибки, которые выявляет валидатор
1SELECT id FROM orders
2JOIN users
3WHERE status =
4Этот запрос приводит к двум ошибкам:
- "В одном или нескольких операторах JOIN отсутствует условие ON." — в
JOIN usersнет предложенияONилиUSING. - "Условие WHERE не завершено." — после знака равенства в
status =нет значения.
Часто задаваемые вопросы
Работает ли этот инструмент с MySQL, PostgreSQL, SQL Server и Oracle?
Он обрабатывает основной синтаксис SQL, общий для этих баз данных: SELECT, JOIN, WHERE, GROUP BY и аналогичные предложения. Специфичный для базы данных синтаксис, например литералы массивов PostgreSQL или процедурные блоки T-SQL, не нарушит работу форматировщика, но может не обрабатываться особым образом.
Отправляется ли SQL-запрос на сервер?
Нет. Форматирование и валидация выполняются в браузере. Текст запроса никуда не передаётся.
Преобразует ли он имена функций, например COUNT, SUM и AVG, в прописные буквы?
Нет. В прописные буквы преобразуются только ключевые слова предложений, слова для соединения таблиц и фиксированный список операторов. Имена функций, такие как count, sum и avg, а также слова asc, desc, true, false и null остаются в точности в том виде, в котором были введены.
Отмечает ли валидатор использование HAVING без GROUP BY?
Нет. Предложение HAVING без GROUP BY группирует весь результат в одну группу, что допустимо в SQL согласно стандарту ISO/IEC 9075, поэтому валидатор не считает это ошибкой.
Может ли валидатор выявить любую ошибку SQL?
Нет. Он проверяет структуру — скобки, кавычки, несколько правил порядка предложений и некоторые распространённые логические пробелы, например JOIN без условия. Он не проверяет имена таблиц или столбцов, типы данных и производительность запроса. Для подтверждения правильного выполнения запроса по-прежнему требуется подключение к настоящей базе данных.
Меняет ли форматирование способ выполнения запроса?
Нет. Форматирование меняет только пробельные символы и регистр ключевых слов, не заключённых в кавычки. Всё внутри строки, идентификатора в кавычках или комментария копируется без изменений, поэтому смысл запроса остаётся точно таким же.