FIRST CH TOOLS / 29 SQL Formatter
SQLクエリフォーマッター&整形
ログやコードから拾った1行に固まったSQLを左に貼ると、予約語が大文字になり、句ごとに改行され、字下げの付いたクエリが右に出ます。JOIN の ON 、サブクエリ、CASE 式もそれぞれの深さへ揃えます。インデント幅・カンマの位置・AND の位置は好みに合わせて選べます。
貼り付けるとその場で整形されます
貼り付けたクエリがブラウザの外へ出ることはありません(字句解析も組み立てもこのページの中だけで動いています)。ファイルの読み込みも端末内で読むだけで、アップロードは行いません。URLパラメータで直接呼び出せます: /sql-format/?sql=select%20*%20from%20t%20where%20id%3D1 / /sql-format/?sql=…&case=lower&indent=2&comma=leading
SQLが読みにくくなるところ
整形しても意味は1文字も変わらない
SELECT a FROM t WHERE b = 1
↓ どちらもデータベースには同じクエリとして届く
SELECT
a
FROM t
WHERE b = 1
SQLは空白・改行・インデントを区切りとしか見ていません。整形は人が読むためのもので、実行計画も結果も変わりません。逆に言えば、レビューで読みにくいクエリを整形して差分を確認する作業はいつでも安全に行えます。ただし文字列リテラルの中の空白は意味を持つため、このツールは'…' の中身には一切触れません。
予約語の大文字は「読む速さ」のため
select id, name from users where deleted_at is null SELECT id, name FROM users WHERE deleted_at IS NULL
SQLの予約語は大文字でも小文字でも動きます。それでも大文字が広く使われているのは、予約語と列名・テーブル名を目で切り分けるためです。列名を小文字で書くチームなら、大文字の語を追うだけでクエリの骨格(SELECT / FROM / WHERE / GROUP BY)が読み取れます。逆に「予約語も小文字」で統一するチームもあるので、このツールは大文字・小文字・そのままの3つを選べます。
識別子の大文字・小文字は環境で意味が変わる
SELECT "Name" FROM users; -- PostgreSQL では Name 列(大文字を保持) SELECT Name FROM users; -- PostgreSQL では name 列に折りたたまれる
予約語と違い、識別子(テーブル名・列名)の扱いはデータベースごとに違います。PostgreSQLは引用符の無い識別子を小文字へ、Oracleは大文字へ折りたたみます。MySQLのテーブル名はOSのファイルシステムに依存して大文字・小文字を区別したりしなかったりします。事故を避けるため、このツールは識別子の綴りを一切変えません。"…" ・`…` ・[…] で囲まれた部分もそのまま残します。
暗黙の結合(FROM に , でテーブルを並べる)
SELECT * FROM orders o, users u WHERE u.id = o.user_id -- 古い書き方 SELECT * FROM orders o INNER JOIN users u ON u.id = o.user_id
カンマ区切りは結合条件と絞り込み条件が同じ WHERE に混ざるため、条件を1つ書き忘れると総当たり(クロス結合)になり、行数が爆発しても気づきにくくなります。明示的な JOIN … ON なら結合条件が ON に、絞り込みが WHERE に分かれます。外部結合は明示的なJOINでしか書けません((+) や *= の独自記法は非推奨・廃止済み)。このツールはカンマ区切りの FROM を見つけたら指摘に出します。
WHERE の無い UPDATE / DELETE
DELETE FROM logs; -- 全行が消える UPDATE users SET flag = 1; -- 全行が書き換わる
1行のクエリを整形したときにいちばん怖いのがこれです。WHERE を書き忘れても構文としては正しいため、そのまま実行できてしまいます。このツールは WHERE の無い UPDATE / DELETE を見つけたら赤い指摘を出します。本番で実行する前に、同じ条件の SELECT で対象行を数えてから実行してください。
SELECT * を本番のコードへ残さない
SELECT * FROM users; -- 列が増えると結果も変わる SELECT id, name, email FROM users; -- 必要な列だけを固定する
アドホックな調査では便利ですが、アプリケーションのコードに残すとテーブルに列が足りたときに転送量と結果の形が変わります。カバリングインデックスだけで完結していたクエリがテーブル本体を読みに行くようになる、といった性能面の影響もあります。列を並べて書けば、そのクエリが何を必要としているかがレビューで読み取れます。
値は文字列連結せずプレースホルダで渡す
-- 危険(SQLインジェクション) "SELECT * FROM users WHERE name = '" + input + "'" -- 安全 SELECT * FROM users WHERE name = ? -- :name / $1 も同じ
SQLインジェクションを防ぐのは、エスケープ処理よりもプレースホルダ(プリペアドステートメント)です。値がクエリの構文として解釈される余地がなくなるためです。このツールは ? ・:name ・$1 ・@var をプレースホルダとして認識し、そのまま残します。ログから拾ったクエリを整形するときも、値を埋め込んだ形のまま再利用せず、プレースホルダに戻してから使ってください。
サブクエリの深さは字下げで見せる
WHERE o.id IN (
SELECT order_id
FROM payments
WHERE captured_at IS NOT NULL
)
サブクエリはどこからどこまでが内側のクエリかが読み取れないと追えません。このツールは ( の直後が SELECT ・WITH ・VALUES のときだけ「サブクエリの括弧」とみなして改行と字下げを入れ、関数呼び出しの括弧(SUM(…) ・IN (1, 2, 3))は1行のままにします。3段以上の入れ子になったら、WITH 句(共通テーブル式)へ切り出すと平らに書けます。
カンマは行頭派と行末派がある
SELECT SELECT
a, a
b, , b
c , c
行頭カンマ(leading comma)は、末尾の列を消したときに前の行を触らずに済むためdiffが小さくなるという利点があります。行末カンマは自然な読み順で、多くのスタイルガイドの既定です。どちらが正しいということはなく、チーム内で揃っていることのほうが重要です。このツールはどちらでも出力できます。
AND / OR は行頭に置くと条件が数えられる
WHERE o.status = 'paid'
AND u.deleted_at IS NULL
AND o.total >= 1000
行頭に AND を置くと、縦に並んだ AND の数がそのまま条件の数になり、条件の追加・削除も1行の増減で済みます。OR が混ざるときは、優先順位(AND が OR より強い)を括弧で明示してください。このツールは BETWEEN a AND b の AND は条件の区切りではないため改行しません。
コメントは消さずに残す
SELECT id -- 主キー FROM t /* 集計対象 */
このツールは -- ・# の行コメントと /* … */ のブロックコメントをそのまま残します。行コメントはその行の終わりまでが対象なので、整形の都合で後ろに何かを続けることはしません(続けるとコメントに飲み込まれてしまうため)。閉じていないブロックコメントがあると以降がすべてコメント扱いになるので、指摘に出します。
方言はそのまま通す
`mysql_style` / "postgres_style" / [sqlserver_style] ::text(キャスト) ->> (JSON) E'…'(エスケープ文字列) $$…$$
このツールは特定のデータベースの文法を検査するパーサーではなく、字句(トークン)を見て整える整形器です。そのため、MySQLのバッククォート・SQL Serverの角括弧・PostgreSQLのキャストやJSON演算子・ドル引用符のように方言で違う書き方も壊さずに通します。逆に、構文エラーそのものは検出しません(括弧と引用符の対応だけは数えて指摘します)。
対応している入力: SELECT / INSERT / UPDATE / DELETE / WITH(共通テーブル式)・UNION などの集合演算・JOIN 各種・CASE 式・ウィンドウ関数(OVER (PARTITION BY … ORDER BY …))・複数ステートメント(; 区切り)。文字列・引用符付き識別子・コメント・プレースホルダはそのまま残します。
How to Use
- SQLを貼り付けるログやコードから拾った1行のクエリを左の欄に貼ります。.sql ファイルのドラッグ&ドロップにも対応しています。
- 整え方を選ぶ予約語の大文字・小文字、インデント幅(スペース2/4/8・タブ)、カンマと AND の位置を切り替えます。1行にまとめるを選べば逆向きの圧縮もできます。
- 結果をコピーする右の欄に整形したSQLが出ます。下のプレビューでは予約語・文字列・コメントを色分けして確認でき、危険な書き方があれば指摘に出ます。
About This Tool
1行に固まったSQLを、句ごとに改行して字下げします。アプリケーションのログやORMが吐いたクエリ、チャットに貼られたクエリは、たいてい改行が潰れて1行になっています。このツールはSQLを字句(キーワード・識別子・文字列・演算子・コメント)へ分解し、SELECT ・FROM ・WHERE ・GROUP BY ・ORDER BY といった句を行頭へ、その中身を1段下げて並べ直します。整形しても意味は変わりません(SQLは空白と改行を区切りとしか見ていないため)。
予約語を大文字にし、識別子には触れません。予約語と型名はキーワード表と照合して大文字(または小文字)へ揃えますが、テーブル名・列名・別名の綴りは1文字も変えません。識別子の大文字・小文字はデータベースによって折りたたみ方が違い(PostgreSQLは小文字へ、Oracleは大文字へ)、引用符付きの識別子では区別されるためです。"…" ・`…` ・[…] で囲まれた部分も、'…' の文字列も、中身をそのまま残します。
括弧は中身を見て扱いを変えます。( の直後が SELECT ・WITH ・VALUES のときだけ「サブクエリ」として改行+字下げし、それ以外(SUM(…) ・COALESCE(…) ・IN (1, 2, 3) ・OVER (PARTITION BY …))は1行のままにします。関数の引数まで縦に伸ばすと、かえって読み取れなくなるためです。CASE 式は WHEN ・ELSE ・END を縦に並べ、BETWEEN a AND b の AND は条件の区切りではないので改行しません。
整形と同時に危険な書き方を指摘します。WHERE の無い UPDATE ・DELETE(全行が対象になる)、閉じていない括弧や引用符、SELECT * 、FROM にテーブルをカンマで並べた暗黙の結合、プレースホルダの有無を「読み取りの結果」に出します。1行のクエリを目で追っているときにいちばん見落としやすいところです。
チームのスタイルに合わせられます。インデントはスペース2つ・4つ・8つ・タブから、カンマは行末・行頭から、AND ・OR は行頭・行末から選べます。「句の中身も次の行から書く」を選ぶと FROM や WHERE の中身も一段下げた完全展開になり、「1行にまとめる」を選ぶと逆に改行を畳んで1行へ戻します(貼り付け直すときに便利です)。選んだ設定はURLパラメータにも対応しているので、社内のドキュメントから決まった設定で開けます。
クエリを整形したあとの差分の確認にはテキスト・コード差分チェッカー、テーブル定義や結果セットをドキュメントへ貼るならMarkdownテーブル整形&CSV/TSV変換、バッチの実行時刻を確かめるならCron式ビジュアル解説が使えます。
From AI Agents
この整形ロジックは、MCP(Model Context Protocol)サーバー @first-ch/tools-mcp の sql_format ツールとしても提供しており、ブラウザを使わずAIエージェントから直接呼び出せます。ファイルパスを渡して読み書きもできます。導入方法の詳細は AIエージェントからの使い方 を参照してください。
導入
claude mcp add firstch-tools -- npx -y @first-ch/tools-mcp
呼び出し例
# 1行のSQLを整形する(予約語を大文字化・句ごとに改行) sql_format(text="select a,b from t where a=1 and b=2") # .sql ファイルを読んで整形し、そのまま書き戻す sql_format(path="/tmp/report.sql", outputPath="/tmp/report.sql") # チームのスタイルに合わせる(スペース2つ・行頭カンマ・予約語は小文字) sql_format(text="select a, b from t", indent="2", commaStyle="leading", keywordCase="lower") # 改行を畳んで1行へ戻す sql_format(text="SELECT\n a\nFROM t", compact=true)
Other Tools
- 01画像→WebP一括変換WebP Converter
- 02白背景の透過White BG Remover
- 03コントラスト比チェッカーContrast Checker
- 04文字数カウントCharacter Counter
- 05llms.txt ジェネレーターllms.txt Generator
- 06JSON-LD構造化データ生成JSON-LD Generator
- 07Markdown→PDF変換MD → PDF
- 08OGPメタタグ生成ウィザードOGP Wizard
- 09faviconジェネレーターFavicon Generator
- 10TikTok投稿ツールTikTok Publisher
- 11文字コード・改行コード変換Encoding Converter
- 12画像→AVIF変換+picture生成AVIF Converter
- 13テストデータ生成Test Data Generator
- 14Marp Markdown→スライドMarp Slides
- 15テキスト・コード差分チェッカーDiff Checker
- 16Cron式ビジュアル解説&発火日時Cron Explainer
- 17Base64 & Data URI変換Base64 & Data URI
- 18URLパラメータ分解・UTMタグ編集URL Parameters
- 19HTMLエンティティ・特殊文字エスケープHTML Escape
- 20JSON ⇄ YAML 相互変換JSON ⇄ YAML
- 21PX ⇄ REM / EM 単位変換&スケール表PX ⇄ REM / EM
- 22Colorコード変換&アルファ透過Color Converter
- 23MD5 / SHA-256 ハッシュ生成Hash Generator
- 24JWTデコーダー&有効期限チェッカーJWT Decoder
- 25User-Agent解析&デバイス判定User-Agent Parser
- 26UUID (v4) & ULID 一括生成UUID & ULID Generator
- 27アスペクト比計算&レスポンシブサイズAspect Ratio Calculator
- 28Markdownテーブル整形&CSV/TSV変換Markdown Table
- 30QRコード生成QR Code Generator
- 31正規表現テスターRegex Tester
- 32UNIXタイムスタンプ⇄日時変換Unix Time Converter
- 33新規タブメモ帳 Chrome拡張New Tab Memo
- 34画像リサイズ&クロップImage Resizer
- 35EXIF情報の確認&除去EXIF Viewer
- 36robots.txt ジェネレーターrobots.txt Generator
- 37安全なパスワード生成Password Generator
- 38文字列ケース変換Case Converter