よくある質問
フォーマッターはクエリを実行・検証しますか?
いいえ。構文を再出力するだけです。パーサは字句が認識可能な形であるかは確認しますが、データベースに接続することも、テーブルを参照することも、列の存在を確認することもありません。本ツールで綺麗に整形されたクエリでも、テーブル名のタイポ、権限不足、スキーマの変化などで実行時に失敗することはあります。
なぜキーワードはデフォルトで大文字ですか?
SQL コミュニティで長く続く慣例です。予約語を大文字にすると、構文ハイライトがないターミナルや grep 出力でも、句の構造が小文字の識別子と対比されて見えやすくなります。Mode・Holistics・SQL Style Guide のガイドラインも一様に推奨しています。チームが Python 風の小文字を好むなら `lower`、入力を変更したくないなら `preserve` に切り替えてください。
どの方言を選べばよいかわからない場合は?
クエリの実行先データベースに合わせてください。不明な場合は PostgreSQL が最も無難な選択です。Standard SQL の広い上位互換(ウィンドウ関数・CTE・`RETURNING`・JSON 演算子など)を受け付け、他のエンジン向けに書かれたクエリの多くも問題なくパースされます。BigQuery・Snowflake・T-SQL を使う場合は、方言固有の句(`QUALIFY`・差集合の `EXCEPT`・`TOP n` など)が対応するパーサを必要とするため、明示的にそれらを選んでください。
タブが無効になっているのはなぜですか? `\t` インデントで出力できますか?
ほとんどのコードレビューツール、diff ビューア、共有環境がタブを予測不能に表示するため(あるエディタでは 4 スペース、別のエディタでは 8 スペースなど)、本ツールはスペースを強制します。スタイルガイドがタブを必須とする場合は、出力を `expand -t1 | sed 's/ /\t/g'` で後処理するか、エディタの一括置換でタブに戻してください。実運用の SQL ファイルはほぼ例外なくスペースを使っています。
クエリ内のコメントは保持されますか?
はい。行コメント(`--`)とブロックコメント(`/* … */`)はどちらも元の位置に保持されます。パース・再出力の往復で消えないので、本番クエリにそのままフォーマッターをかけてもインラインドキュメントは失われません。`/*+ INDEX(t i_t_a) */`(Oracle)や `/*! STRAIGHT_JOIN */`(MySQL)などのヒント構文も通常のコメントブロックとして保たれます。
エディタの format on save には本ツールと CLI のどちらを使うべきですか?
エディタ連携には CLI を使ってください — `pg_format`、`sqlfluff format`、または `sql-formatter` パッケージ自体を Prettier プラグインで呼ぶ方法があります。本ウェブツールは単発の貼り付け用です(同僚のアドホッククエリ、スクリーンショットから書き写したクエリ、チケットを切る前の確認など、10 行整形するためにプロジェクトを開くのが過剰な場合)。両者は同じフォーマットライブラリを共有するので出力結果に齟齬はありません。
関連する概念
SQL は 1986 年に最初に標準化され(ANSI SQL-86)、現行版は SQL:2023 ですが、主要エンジンはどれも標準の上に独自の方言を載せています。差は表層的ではありません。Snowflake で動くクエリが PostgreSQL ではパースできない、というのは `QUALIFY`・`LATERAL FLATTEN`・`:` 変数置換などのせいです。`GO` セパレータや `DECLARE @x` を含む T-SQL バッチは MySQL からは意味を成しません。方言対応のフォーマッターは、選択された文法に対してクエリをパースし、標準にない構文も保持したまま再出力します。
フォーマットは近接する 3 つの分野のひとつです。**フォーマット** はクエリの意味を変えず、ホワイトスペースとケースのみを再構成します(本ツール)。**リント** はスタイルや正しさの匂いを検出します(`sqlfluff`・`sqlint`・Snowflake 向け `dbt` linter など)。修飾なしの `*`、未使用 CTE、暗黙の型変換などです。**静的解析** はもう一歩進み(`squawk`・`eversql`・`pganalyze` など)、クエリプランを読みインデックス不足やテーブルロックを伴う DDL を警告します。フォーマッターはコミットごとに安全に自動実行できます。リンタは pre-commit フック向き。アナライザは通常、実プランナに対して走らせます。
隣接する 3 つの SQL 記述慣行も覚えておくと役立ちます。**先頭カンマ**(`, column_a` を `column_a,` の代わりに置く)は行を追加する際の diff を綺麗にし、Mode・HashiCorp・いくつかのデータチームのスタイルガイドが採用しています。`sql-formatter` はこれを強制しません。**川型フォーマット**(river formatting)は句キーワード(`SELECT`・`FROM`・`WHERE` など)を共通の列に右揃えで配置します。古い Oracle 系の現場で見られ、保守が難しいため現代のガイドの多くは推奨しません。**スタック形式**は本ツールの既定で、句のヘッダを単独行に置き、内容を下にインデントします。チームがプルリクエストで最も速く読める形式を選び、フォーマッターに統制させるのが現実的です。