ログのSQLをレビューしやすい形に
一行に詰まったクエリでは、列の一覧や結合条件の境目を追いにくくなります。SQLフォーマッターで改行とインデントをそろえると、SELECT、JOIN、WHEREの位置を見つけやすくなり、レビューの準備に役立ちます。
SQLを貼り付けて方言を指定し、スペース2個・4個・タブからインデントを選びます。キーワードの表記を決めて「SQLを整形」を押してください。結果は別欄に表示され、入力SQLと比較できます。入力や設定を変えた場合は、結果を再生成してください。
実際に使っているデータベースを選ぶ
標準SQL、PostgreSQL、MySQL、MariaDB、SQLite、SQL Server(T-SQL)、Oracle SQL、BigQuery、Snowflakeから選べます。識別子の囲み方や独自構文を正しく読み取るため、元のSQLに合う方言を指定してください。
別の方言を選んでもデータベース間の変換は行われません。MySQLの関数をPostgreSQL向けに置き換える機能ではありません。また、Oracle SQLを選んでもストアドプロシージャ全般を整形できるわけではありません。
整形と動作確認を分けて考える
CTEやサブクエリの階層が見えると、条件を追いやすくなります。ただし、SQLが整形できてもテーブルや列の存在、型の整合性、取得結果の妥当性は確認されません。実行計画の調査や構文の検証には、データベース側のツールを使ってください。
大文字・小文字の設定は認識されたキーワードに適用されます。識別子、関数名、データ型の表記は維持され、パラメーターの値は埋め込まれません。コメントは残りますが、空白や位置が調整される場合があります。
サンプルで見る整形結果
架空のデータを使った整形結果です。キーワードは大文字、インデントはスペース2個に設定しています。ツールでサンプルを読み込むと、対応する方言も選択されます。
JOINと集計
支払済み注文を顧客別に集計する例です。結合条件とWHERE・HAVINGの役割を見比べられます。
SELECT
c.id,
c.name,
count(o.id) AS order_count,
sum(o.total) AS revenue
FROM
customers c
JOIN orders o ON o.customer_id = c.id
WHERE
o.status = 'paid'
GROUP BY
c.id,
c.name
HAVING
sum(o.total) > 1000
ORDER BY
revenue DESC;整形ツールに戻る ↑CTEとウィンドウ関数
PostgreSQLのCTEとROW_NUMBERで顧客ごとの注文に順位を付けます。入れ子の構造に注目してください。
WITH
ranked_orders AS (
SELECT
id,
customer_id,
total,
row_number() OVER (
PARTITION BY
customer_id
ORDER BY
created_at DESC
) AS position
FROM
orders
WHERE
created_at >= date '2024-01-01'
)
SELECT
customer_id,
id,
total
FROM
ranked_orders
WHERE
position = 1
ORDER BY
customer_id;整形ツールに戻る ↑INSERTとコメント
MySQLのバッククォート付き識別子、コメント、セミコロンを含む文字列を使った例です。
-- Fictional seed data
INSERT INTO
`products` (`sku`, `name`, `price`)
VALUES
('DEMO-01', 'Desk lamp; warm light', 29.95),
('DEMO-02', 'Reader''s notebook', 8.50);整形ツールに戻る ↑よくある質問
整形したSQLを保存できますか?
結果欄のコピーやダウンロードを使えます。ファイル名はformatted.sqlです。Ctrl+Enter、macOSではCommand+Enterでも整形できます。
入力したSQLは送信されますか?
整形処理はブラウザー内のWeb Workerで実行します。クエリを整形APIに送信せず、データベースに接続しません。ツールは入力を永続保存したりURLに含めたりしません。
SQLの実行速度も改善しますか?
いいえ。改行やインデント、キーワード表記を整える機能です。インデックスの提案や結合の書き換え、実行計画の最適化は行いません。
複数の文をまとめて整形できますか?
通常のSQL文をセミコロンで区切って入力できます。認識された文字列内のセミコロンはデータとして扱われます。独自のDELIMITER指定や手続き型スクリプトは対象外です。
エラーになったときは何を確認しますか?
方言、引用符、括弧を確認してください。Jinjaなどのテンプレートやアプリケーション側の式展開は認識できない場合があります。上限は50,000文字で、処理は10秒で打ち切ります。長いSQLは分割してください。
プレースホルダーやコメントは残りますか?
対応する方言のプレースホルダーには値を代入しません。コメントも残しますが、配置は変わることがあります。整形を無効にする特殊なコメントがある範囲は、整形されずに残る場合があります。
