本文へスキップ

SQLフォーマッター

SQLクエリを句(SELECT、FROM、WHERE …)ごとに改行し、インデントして整形します。方言は標準SQL・MySQL・PostgreSQL・SQLite・T-SQL・BigQueryから選べます。構文チェッカーではありません。

0文字 · 0行
キーワードの大文字・小文字

結果0文字 · 0行

入力した内容はこのブラウザの中だけで処理され、サーバーには送信されません。 仕組みを見る

1行のSQLクエリをSELECT句とFROM句ごとに改行してインデント

使い方

まず「方言」で、クエリを実行するデータベースを選びます。選べるのは「標準SQL」「MySQL」「PostgreSQL」「SQLite」「T-SQL(SQL Server)」「BigQuery」です。続いて「入力」にクエリを入れ、次の3つを決めます。

  • キーワードの大文字・小文字:「大文字(SELECT)」「小文字(select)」「入力のまま」のいずれかです。
  • インデント:「半角スペース2つ」「半角スペース4つ」「タブ」のいずれかです。
  • クエリ間の空行:セミコロン(;)で区切られたクエリのあいだに入れる空行の数です。0から5まで指定でき、初期値は1です。

標準SQL、大文字、半角スペース2つで次の1行を整形した結果です。

select u.id, count(o.id) as orders from users u left join orders o on o.user_id = u.id where u.created_at >= '2026-01-01' group by u.id having count(o.id) > 3 order by orders desc
SELECT
  u.id,
  count(o.id) AS orders
FROM
  users u
  LEFT JOIN orders o ON o.user_id = u.id
WHERE
  u.created_at >= '2026-01-01'
GROUP BY
  u.id
HAVING
  count(o.id) > 3
ORDER BY
  orders DESC

「結果」では、キーワードが太字、文字列と数値が色、コメントが斜体で区別されます。この色分けは単語の見た目だけで判断しているので、default や index のように予約語と同じ名前の列は、引用符で囲まないかぎりキーワードと同じ太字になります。結果が20万文字を超えると「結果が大きいため、色分けせずに表示します」と表示され、文字だけになります。結果の下の「行数」と「サイズ」は、整形後の結果を測った値です。

複数のクエリをまとめて入れると、セミコロンを区切りにしてそれぞれを整形します。最後のクエリにセミコロンがなければ、結果にも付けません。

「キーワードの大文字・小文字」が変える範囲

「キーワードの大文字・小文字」が効くのは、select、from、as、join といった予約語だけです。関数名とデータ型、テーブル名と列名、文字列の中の文字は、入力したままにします。

  • 「大文字(SELECT)」で select count(*), cast(x as int) from t を整形すると、大文字になるのは SELECT、AS、FROM だけで、count(*) と int は小文字のまま残ります。
  • 「小文字(select)」で SELECT Now() FROM t を整形すると、select と from は小文字になり、Now() はそのままです。
  • where name = 'select from' の引用符の中は、どの設定でも変わりません。

COUNT や INT まで大文字にそろえるチームのルールがあるなら、その部分は自分で直す必要があります。

方言を選び間違えると起こること

引用符やプレースホルダーの書き方は、データベースごとに違います。合わない方言を選ぶと、実行するうえでは問題のないクエリでも解析できずにエラーになります。次の表は、同じ入力を6つの方言それぞれで試した結果です。

入力 エラーになる方言 整形できる方言
select [a] from [t] 標準SQL、MySQL(1行8列) PostgreSQL、SQLite、T-SQL、BigQuery
select `a` from `t` PostgreSQL、T-SQL(1行8列) 標準SQL、MySQL、SQLite、BigQuery
select a::int from t 標準SQL、MySQL、SQLite、BigQuery(1行9列) PostgreSQL、T-SQL
select * from t where a = $1 標準SQL、SQLite、T-SQL、BigQuery(1行27列) MySQL、PostgreSQL

エラーにならなくても、結果が微妙に変わることがあります。select top 5 a from t を「T-SQL(SQL Server)」で整形すると TOP は大文字になりますが、ほかの5つの方言では top がキーワードとして認識されず、小文字のまま残ります。逆に limit 5 は、T-SQLでだけ小文字のままです。エラーが消えるまで方言を切り替えて試すより、実際に使っているデータベースを選ぶほうが安全です。

エラーが出なくても、正しいSQLとは限りません

このツールはクエリを実行しませんし、文法を最後まで検査することもしません。単語に分け、句の境目を見つけて行をそろえているだけなので、間違ったクエリも大半はそのまま通ります。

  • selct * form users(打ち間違い)は、エラーにならず1行のまま出てきます。句ごとに分かれなかったことが唯一の手がかりです。
  • select * from users where(条件が抜けている)は、WHERE で終わる形に整形されます。

エラーとして捕まるのは、おもに対応の取れていない括弧や引用符、そして選んだ方言にない記号です。その場合は「このSQLを解析できません。1行24列付近を確認してください。」のような案内と、その行、^ の印が表示されます。

入力(標準SQL) 表示される位置 原因
select * from (select 1 1行24列(入力の末尾) 括弧を閉じていない
select * from users) 1行20列 開き括弧がないのに閉じている
select 'abc 1行8列 引用符を閉じていない

閉じていない括弧は入力の末尾を指します。表示された位置ではなく、それより前で相手のいない開き括弧を探してください。

整形エンジンは最初の入力時に読み込みます

整形を受け持つのは、sql-formatterというオープンソースのライブラリです。サイズが大きいので、ページを開いたときではなく、クエリを最初に入力した時点でダウンロードします。そのあいだ、結果欄には「整形しています…」と表示されます。ダウンロードするのはエンジンのコードだけで、クエリがそのリクエストに載ることはありません。ページを開いたあとインターネットが切れた状態で最初の入力をすると、「整形エンジンを読み込めませんでした。インターネット接続を確認してページを再読み込みしてください。」と表示されます。

1行にまとめる圧縮機能はありません。このライブラリが提供しているのは改行して整える機能だけです。空白を単純に削る方法は、文字列やコメントの中の空白まで壊すおそれがあるため入れていません。行数を減らしたい場合にできるのは、「クエリ間の空行」を0にすることくらいです。

参考資料

よくある質問

クエリの一部だけ、手でそろえた形のまま残したいのですが、方法はありますか?

その範囲を /* sql-formatter-disable */ と /* sql-formatter-enable */ のコメントで挟んでください。2つのコメントのあいだは解析せず、入力した文字のまま結果に写し、その前後のクエリだけを整形します。このコメントは結果にも残ります。

ストアドプロシージャや、DELIMITERの入ったスクリプトも整形できますか?

うまくいきません。整形エンジンのsql-formatterは、ストアドプロシージャと、クエリの区切り文字をセミコロン以外に変える構文には対応していないと明記しています。実際、MySQLの方言で DELIMITER // から始まるプロシージャを入れると、エラーにはならず結果が出ますが、// が / / に離れ、本体の改行位置もずれます。こうしたスクリプトは、プロシージャの中のSELECT文やUPDATE文だけを取り出して整形してください。

コードからコピーしたクエリに {{ name }} のようなテンプレート記法が入っていると、どうなりますか?

6つの方言すべてでエラーになります。select * from t where a = {{ var }} を入れると、標準SQLでは1行27列、つまり開き波括弧の位置を指します。テンプレートの部分を仮の値(数字の1や 'x' など)に置き換えて整形し、あとで元に戻してください。疑問符(?)や $1、:name のようなプレースホルダーは、方言によって受け付けられることもあれば、エラーになることもあります。

使用しているオープンソース: sql-formatter (MIT), nearley (MIT)

最終更新日: