tigtools

SQLフォーマッター

クエリを貼り付け、データベースの方言を選ぶと、インデントの整った読みやすいSQLに変換できます。データはサーバーに送信されません。

ブラウザー内で動作 登録不要

インデント

使い方

  1. SQL文を1つ以上貼り付けるか、「例を試す」を押します。
  2. キーワード、引用符、演算子を正しく認識できるよう、データベースの方言を選択します。
  3. キーワードの大文字・小文字とインデントを設定します。入力すると、右側にフォーマット結果が表示されます。
  4. 「Minify」を押すと1行にまとめられます。結果をコピーするか、.sql ファイルとしてダウンロードしてください。

仕組み

フォーマットにはオープンソースの sql-formatter ライブラリを使用します。選択した方言のルールに従ってクエリをトークンに分割し、主要な句(SELECT、FROM、JOIN、WHERE、GROUP BY、ORDER BY など)をそれぞれ独立した行に配置します。列のリストや条件にはインデントを付け、キーワードの大文字・小文字を指定どおりに整えます。変更するのは空白と、指定した場合はキーワードの大文字・小文字だけです。識別子、文字列リテラル、コメントはそのまま保持されます。適切な方言を選ぶことが重要です。たとえば、MySQLではバッククォート、SQL Serverでは角括弧で名前を囲み、PostgreSQLでは $$ で関数本体を開始します。

このフォーマッターはレイアウトを整えるツールであり、データベースではありません。テーブルや列が存在するかは確認せず、文法全体の検証もしないため、無効なSQLでもエラーなくフォーマットされる場合があります。入力を解析できない場合(閉じられていない括弧など)は、処理を停止した行と列を報告します。

Minifyの動作は異なります。すべてのトークンを保持したまま、連続する空白を1つのスペースにまとめ、コメントを削除します(/*+ INDEX(t) */ などのオプティマイザーヒントと、動作に影響するMySQLの /*! … */ コメントは保持されます)。文字列、引用符で囲まれた識別子、ドル引用符で囲まれた本体は変更されません。閉じられていない引用符やコメントがある場合、推測で処理せずエラーで停止します。

使用例

ログのクエリを読みやすくする

スロークエリログに400文字の1行として記録されたクエリを、MySQL方言とキーワードの大文字表記でフォーマットします。各JOINとWHERE条件が独立した行に配置された読みやすい形式になり、欠けているインデックスを見つけやすくなります。

コードレビューで一貫したスタイルを保つ

チームでコミット前にすべてのマイグレーションをPostgreSQL方言、キーワードの小文字表記、4スペースのインデントでフォーマットすれば、差分には実際の変更だけが表示されます。

コードへのSQLの埋め込み

コメント付きの複数行レポートクエリを、SELECT id, name FROM users WHERE active = 1 ORDER BY name のような1行にまとめます。スクリプト内の文字列に貼り付けて使えます。

よくある質問

どのデータベースに対応していますか?

Standard SQL、MySQL、MariaDB、PostgreSQL、SQLite、SQL Server(T-SQL)、Oracle PL/SQL、BigQuery、Snowflake、Redshift、Spark SQL、Hive、Trino/Presto、DuckDB、IBM Db2、SingleStoreDB、TiDB、Couchbase N1QLに対応しています。

フォーマットするとクエリの動作は変わりますか?

通常、クエリの動作は変わりません。変更されるのは空白と、選択した場合のキーワードの大文字・小文字だけです。SQLではキーワードの大文字・小文字は動作に影響しません。ただし、特に方言特有の機能を使っている場合は、本番データに対して実行する前に生成された出力を確認してください。

「フォーマットできません」と表示されるのはなぜですか?

トークナイザーが解析できない箇所に遭遇しています。閉じられていない括弧や引用符、または別の方言の構文が原因としてよくあります。メッセージに表示された行と列を確認し、選択した方言がデータベースに合っているか確かめてください。

SQLの妥当性を検証できますか?

いいえ。データベースに接続せず、スキーマも参照しません。クエリをフォーマットできても、実行時に失敗する場合があります。

プライバシー

SQLはJavaScriptを使ってブラウザー内でフォーマットされます。アップロード、保存、アナリティクスへの送信は行われず、データベースに接続することもありません。