SQLを読みやすく整形する
SQLを貼り付けて「整形」を押すと、SELECT・FROM・WHEREなどの主要な句ごとに改行し、インデントを揃えて返します。文字列リテラルやコメントの中身はそのまま保持し、すべてブラウザ内で処理します。
使い方とAIOクエリ例
ORMやAIが生成した1行のSQL、あるいは改行が崩れたSQLを、句ごとの改行とインデントに整え直します。入力はブラウザ内だけで処理し、外部へ送信しません。
- 基本の例:
sql_formatter.html?input=select id,name from users where status='active'&indent=space2&keyword_case=upper&format=json format=jsonは機械可読JSON(formatted/line_count/keyword_count/statement_count)、format=rawは整形後のSQLだけを返します。同じURLなら常に同じ結果になります。
改行の対象になる主な句
次の句の前で改行し、内容を1段階インデントします。JOINとONはそれぞれ別の行になります。一覧にない語(AND/OR/関数名など)は改行せず、同じ行の中で整えます。
| 分類 | 句 |
|---|---|
| 検索 | SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT / OFFSET / FETCH |
| 結合 | JOIN / INNER JOIN / LEFT JOIN / RIGHT JOIN / FULL JOIN / FULL OUTER JOIN / CROSS JOIN / ON |
| 集合 | UNION / UNION ALL / INTERSECT / EXCEPT |
| 更新系 | INSERT INTO / VALUES / UPDATE / SET / DELETE FROM / RETURNING |
| CTE | WITH(括弧の直後が SELECT または WITH の場合はサブクエリとして1段ネストします) |
SQL整形は、1行に詰め込まれたSQLや改行位置が崩れたSQLを、SELECT・FROM・WHERE・JOINといった主要な句ごとに改行し、内容を段階的にインデントして読みやすく組み直すツールです。同じ「SQL・コード生成」カテゴリのSQLキーワード大文字化がキーワードの大小文字だけを変換するのに対し、本ツールは改行位置とインデントという「見た目の構造」そのものを組み立て直します。トークンを一つずつ走査する過程で、引用符に囲まれた値や角括弧・バッククォート付きの名前、--以降の一行コメント、/* */で挟んだ複数行のコメントは中身を書き換えの対象から外し、入力どおりの形で残します。同じ入力・同じオプションであれば常に同じ結果になり、解析も整形もブラウザ内のJavaScriptだけで完結するため、貼り付けた内容が外部のサーバーへ渡ることはありません。
使い方・サンプル・結果例・注意点
使い方
「SQL入力」欄にSQL文を貼り付け、「インデント」(半角スペース2つ/4つ/タブ)と「キーワードの大文字・小文字」(大文字にする/小文字にする/入力のまま)を選んでから「整形」を押すと、「結果」欄に整形後のSQLが表示されます。あわせて行数・認識した予約語数・文の数(;区切り)の統計も表示されます。SQLが空の場合や、引用符・コメント・括弧が閉じていない場合はエラー内容がステータス欄に表示され、結果は生成されません。
サンプル入力
select u.id, u.name, count(o.id) as order_count from users u left join orders o on o.user_id = u.id where u.status = 'active' and u.created_at >= '2026-01-01' group by u.id, u.name having count(o.id) > 0 order by order_count desc limit 10;
結果例
上のサンプルを既定設定(半角スペース2つ・大文字)で整形すると、SELECT/FROM/LEFT JOIN/ON/WHERE/GROUP BY/HAVING/ORDER BY/LIMITがそれぞれ独立した行になり、SELECTの列やGROUP BYの列はカンマの直後で改行されて1段深くインデントされます(末尾にカンマを残す形式)。JOINとONは意図的に別々の行に分かれます。EXISTS(...)のようなサブクエリは、開き括弧の後で内側のSELECT/FROM/WHEREがさらに1段深くインデントされ、閉じ括弧は開き括弧があった行と同じ深さに揃います。文字列'active'や'2026-01-01'の中身、関数名count(キーワード一覧に無い識別子扱い)は変換されません。
注意点
改行の対象になる句は本ページの一覧表のとおりで、一覧に無い語(AND/OR/NOT/関数名など)は同じ行の中でスペースだけを整えます(v1ではAND/ORでの改行は行いません)。識別子や関数名の直後の括弧(count(x)、users(id, name) など)は、テーブル名か関数名かを構文的に区別しないため、どちらもスペースなしで連結します。数値の符号(-1など)は前の値と空白なしで連結し、二項演算(a - 1)とは区別します。本ツールはあくまで見た目の整形であり、SQLとして実行できるか(存在しないテーブル名や文法誤りなど)は検証しません。検証するのは、文字列・識別子・コメントが正しく閉じているか(unterminated_literal)と、括弧の対応が取れているか(unbalanced_parentheses)だけです。入力上限は20,000文字(too_long)です。方言固有の構文(ストアドプロシージャの独自記法など)は未対応キーワードとして改行せずに素通りしますが、エラーにはなりません。
こんなときに使えます
- システム開発者が、複数人がそれぞれのスタイルでコミットしたSQLファイルを、レビュー前にインデントと改行位置だけ揃えておく
- 運用担当者が、監視ツールやスロークエリログに1行のまま残った実行SQLを、原因調査のために構造の見える形へ組み直す
- これからSQLを学ぶ人が、自分で書いたクエリをSELECT・FROM・WHEREなどの区切りごとに改行して、文の組み立てを目で追えるようにする
- 社内のコーディング規約に合わせて、貼り付けたSQLのインデント幅(半角スペース2つ/4つ/タブ)とキーワードの大文字・小文字をまとめて統一する
よくある質問
SQLキーワード大文字化との違いは何ですか?
SQLキーワード大文字化はキーワードの大文字・小文字だけを変換し、改行やインデントには一切手を加えません。本ツールはその逆で、改行位置とインデントという見た目の構造を組み立て直すことが主目的で、あわせてキーワードの大文字・小文字(大文字/小文字/入力のまま)も選べます。1行に詰め込まれたSQLを読みやすくしたい場合は本ツール、大文字・小文字の表記だけを揃えたい場合はSQLキーワード大文字化を使い分けてください。
SQL IN句生成との違いは何ですか?
SQL IN句生成は、Excelなどからコピーした値の一覧からIN(...)句そのものを新規に生成する専用ツールです。本ツールはすでに書かれたSQL全体を整形する用途のため、対象も出力も別物です。IN句の値一覧を作る場面ではSQL IN句生成、既存のSQL全体の見た目を整えたい場面では本ツールを使ってください。
SQLの構文チェックや実行はできますか?
できません。本ツールが確かめるのは、値や名前を囲む引用符・括弧・コメント記号がきちんと対になっているかという、整形を組み立てるうえで最低限必要な前提だけです。存在しないテーブル名や列名を指しているか、SQLとして文法的に正しいかは判定せず、SQLを実際に実行することもありません。
JOINとONが別々の行になるのはなぜですか?
本ツールは主要な句ごとに改行するというルールを一律に適用しており、JOIN(LEFT JOINなどの結合種別を含む)とONはそれぞれ独立した句として扱っています。そのため「LEFT JOIN orders o」の次の行に「ON o.user_id = u.id」が続く形になります。1行にまとめる設定は現時点では用意していません。
テーブル名の直後の括弧にスペースが入らないのはなぜですか?
本ツールはSQLを意味的に解析するのではなく、トークンの並びから機械的にスペースの有無を決めています。識別子(テーブル名や関数名の区別はできません)のすぐ後ろに括弧が続く場合は、count(x)のような関数呼び出しと同じ規則を一律に適用するため、users(id, name)のような列一覧もスペースなしで連結されます。読み違いが起きにくいよう、この規則は一覧表と合わせて明記しています。
貼り付けたSQLはサーバーに送信されますか?
送信しません。トークン分割・句の判定・整形の組み立てはすべてブラウザ内のJavaScriptで完結し、入力したSQLが外部へ送られることはありません。同じSQL・同じオプションであれば、いつでも同じ整形結果になります。