SQL フォーマットツール
SQLフォーマットとは?
SQLフォーマットは、圧縮された乱雑なSQLステートメントを、インデント整った、キーワードが強調された読みやすいフォーマットに変換するプロセスです。良いSQLフォーマットはコードの可読性を向上させ、チームコードレビューを容易にし、クエリロジックと条件を素早く特定できます。データベース開発とメンテナンスに不可欠なスキルです。
使い方
使い方
- 左側の入力欄にSQL文を貼り付けるか入力
- インデント幅(2スペース、4スペース、Tab)とキーワードの大小文字を選択
- 「フォーマット」でSQLを整形、「圧縮」で余白を削除
- 結果は右側にシンタックスハイライト付きで表示されます
- 「コピー」または「ダウンロード」で結果を保存
SQLレビュー時の注意点
- 整形は可読性を向上させますが、権限、インデックス、実行プラン、業務ロジックの正当性は検証しません。
- 変更したSQLを実行する前に、生成された句、文字列リテラル、コメント、データベース固有の構文を手動で確認してください。
利用シーン
仕組み
出力パスでは各句に1つのルールを適用します。SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT はそれぞれ列0で新しい行を開始し、投影列やON条件は1段階(2スペース、4スペース、またはタブ)インデントし、JOINキーワード(INNER / LEFT / RIGHT / FULL / CROSS)はFROMの下に揃え、CASE / WHEN / THEN / ELSE / ENDは縦に並べ、括弧付きサブクエリやWITH内のCTEは追加のインデントレベルを付与して外側のSELECTが視覚的にアンカーされたままになるようにします。文字列リテラル、行コメント(-- ...)、ブロックコメント(/* ... */)、ドル引用ブロックは1回だけトークン化され、中身はそのまま出力されるため内部の空白は変更されません。
キーワードの大文字小文字変換はソースに対して盲目的な正規表現で行うのではなく、出力時に適用されます。RESERVED_KEYWORD として分類されたトークンのみが大文字または小文字に変換されるため、バッククォート内の `order` や `user` という識別子は元の大文字小文字のまま保持されます。方言対応は重要です。予約語リストがエンジンによって異なるためです。PostgreSQL は DISTINCT ON、RETURNING、ILIKE を認識し、MySQL は IFNULL、LIMIT n,m、ENGINE= を追加し、SQL Server は TOP n、OUTPUT、角括弧識別子を使用し、Oracle は DUAL、ROWNUM、EXCEPT の代わりに MINUS を使用し、BigQuery と Snowflake は QUALIFY、EXCEPT(列指定)、配列/構造体リテラルで標準を拡張しています。性能はソース長に比例(O(n)トークン、O(n)出力バイト)するため、数MBのマイグレーションスクリプトでもミリ秒でフォーマットできます。
- トークナイザ:ソースを RESERVED_KEYWORD、IDENTIFIER、STRING_LITERAL、NUMBER、OPERATOR、LINE_COMMENT(-- ...)、BLOCK_COMMENT(/* ... */)、WHITESPACE のクラスに分割し、コメントと文字列はそのまま保持する
- 方言対応:一重引用符文字列(ANSI)、バッククォート識別子(MySQL)、角括弧識別子(SQL Server)、二重引用符識別子(PostgreSQL/標準)、ドル引用ブロック $$...$$(PostgreSQL)
- 句レイアウト:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT はそれぞれ列0にアンカーし、投影列とON条件は1段階インデントし、JOINキーワードはFROMの下に揃える
- CTEとサブクエリのインデント:WITH句は内側のSELECTを1段階追加インデントし、EXISTS / IN / スカラコンテキスト内の相関サブクエリはそれぞれ独自のインデントを付与して外側のクエリがアンカーされたままになるようにする
- 大文字小文字ポリシー:出力時にトークンクラスごとに適用され、RESERVED_KEYWORDトークンのみが大文字/小文字に変換される。`order` や [user] のような識別子は元の大文字小文字のまま保持される
- バインドパラメータ:クエスチョンマークプレースホルダー(MySQL prepared statement)、$1/$2番号付きバインド(PostgreSQL)、コロン名バインド(Oracle/SQL*Plus)は PARAMETER としてトークン化され、識別子として再フォーマットされることはない
- 計算量:O(n)の字句解析とO(n)の出力(n = ソース長)。数MBのマイグレーションスクリプトもミリ秒でフォーマット可能。sql-formatter npmライブラリ、pgFormatter、Prettier SQLプラグインと同等
使用例
JOIN と WHERE を含む密な SELECT を整形
入力: select u.id,u.name,o.total from users u left join orders o on o.user_id=u.id where u.status='active' and o.created_at>='2026-01-01' order by o.total desc limit 10;
出力:
SELECT u.id, u.name, o.total
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.status = 'active'
AND o.created_at >= '2026-01-01'
ORDER BY o.total DESC
LIMIT 10;整形済み SQL を 1 行に圧縮して設定文字列に
入力(整形済み、6 行):
SELECT id, name
FROM products
WHERE price < 100
AND stock > 0
ORDER BY name;
圧縮後の出力(1 行、78 文字):
SELECT id,name FROM products WHERE price<100 AND stock>0 ORDER BY name;WITH(CTE)+ ネストしたサブクエリの整形
WITH recent_orders AS (
SELECT user_id, SUM(total) AS spend
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY user_id
)
SELECT u.name, r.spend
FROM users u
JOIN recent_orders r ON r.user_id = u.id
WHERE r.spend > (SELECT AVG(spend) FROM recent_orders);キーワードを小文字化(チームスタイル)
設定: インデント = スペース 2、キーワード = 小文字
入力: SELECT * FROM Users WHERE Status=1;
出力:
select *
from users
where status = 1;
用途: Ruby on Rails / Django ORM スタイルのマイグレーションファイルに合致よくある質問
どの SQL 方言に対応していますか?
標準 ANSI SQL に加え、各方言固有のキーワードに対応しています。MySQL、PostgreSQL、MSSQL/T-SQL、SQLite、Oracle、BigQuery、Snowflake などです。ドロップダウンから対象の方言を選択することで、フォーマッターが方言固有のキーワード(LIMIT と TOP、RETURNING、MERGE など)を認識します。
どのようなスタイルオプションがありますか?
キーワードの大文字/小文字、インデント幅、列リストでのカンマ前置/後置、折り返しの最大行長、キーワードの前後どちらで改行するかなどです。通常はサイドパネルにオプションが表示されます。
SQL の構文チェックは行いますか?
ほとんどのフォーマッターは緩やかにパースし、疑わしい SQL もそのまま通します。本格的な構文検証にはデータベース接続(あるいは sqlparse、sqlglot のような実 SQL パーサー)が必要です。本ツールはレイアウト整形用とし、構文チェックは IDE や実際のデータベースで行ってください。
ストアドプロシージャやトリガーも整形できますか?
ほとんどの実装は CREATE PROCEDURE / CREATE FUNCTION / トリガーを方言がサポートする範囲で扱えます。制御フロー(IF/ELSE/WHILE)を含む長い本体も正しく整形されますが、ベンダー拡張(T-SQL 固有のキーワードなど)には適切な方言の指定が必要です。
クエリはアップロードされますか?
いいえ。整形は JavaScript 製の SQL パーサーを使ってブラウザ内で実行されます。貼り付けた SQL は送信されません。とはいえ、本番環境の認証情報や個人情報を Web ツールに貼り付けるのは避けてください。
CTE や JOIN のインデントが妙な形になるのはなぜ?
フォーマッターによって CTE の整列方法は異なります。各 CTE 定義をインデントするものもあれば、左揃えのままにするものもあります。JOIN にも同様に複数の有効なスタイル('JOIN x ON' と 'JOIN x\n ON')があります。チームのスタイルに合うオプションを選び、統一して使うのが良いでしょう。
SQL を最小化することはできますか?
実装によっては「1行モード」が用意されており、改行や余分な空白を取り除けます。コード中に文字列リテラルとして SQL を埋め込む際に便利です。レビューでは1行 SQL は読みづらいため、整形済みのバージョンをバージョン管理に残しておきましょう。