シンプルなクエリを整形
select id,name from users where active=true order by created_at desc limit 10SELECT id, nameFROM usersWHERE active = trueORDER BY created_at DESCLIMIT 10;各句が別々の行に分かれ、列リストがインデントされました。これだけでコードレビューでの読みやすさが10倍くらい違ってきます。
構文を意識したインデントで SQL を整形。
最終更新
SQLフォーマッターは、ぎっしり詰まった一行SQLやORMが吐き出した自動生成のSQLを受け取り、インデントと改行を統一した形に書き直します。コードレビューでJOINを確認したい、フィルターをデバッグしたい、ORMの出力を整理したい、チケットやドキュメントにSQLを貼りたい、クエリプランを順番に追いたい――そんな場面で頻繁に出番があります。
整形してもクエリの「動作」は変わりません。変わるのは「人間にとっての読みやすさ」だけです。レイアウトが揃うと、SELECT・FROM・JOIN・WHERE・GROUP BY・HAVING・ORDER BY の関係性がグッと把握しやすくなります。サブクエリやCTEが入り混じった複雑なクエリほど効果は大きいです。
SQLには「方言」がたくさんあります。PostgreSQL、MySQL、SQLite、T-SQL(Microsoft SQL Server)、Oracle、BigQueryなど、それぞれが標準SQLを独自に拡張しています。しっかりしたフォーマッターは選択した方言を理解しているので、ベンダー固有の構文を壊さずに整形してくれます。
SELECT は列の選択、FROM はテーブル指定、WHERE は行のフィルタリング、GROUP BY は集約、ORDER BY は並び替えです。RETURNING、LIMIT、TOP、識別子のクォート([col] と "col" など)はDB間で互換性がありません。入力欄にSQLを貼り付けます。一行のもの、ORMが生成したもの、途中まで整形済みのもの、どれでもOKです。
PostgreSQL、MySQL、SQLite、T-SQLから選択。これで LIMIT、TOP、RETURNING などベンダー固有のキーワードが正しく扱われます。
キーワードの大文字/小文字(大文字が一般的)と、インデント幅(2か4スペース)を選びます。多くのチームは「キーワード大文字+2スペース」が定番です。
各句が独立した行に並び、JOINは揃い、サブクエリにはインデントが入ります。コメントもそのまま残ります。
整形後のクエリをマイグレーションファイル、ORMの生クエリ、BIツールなどに貼り戻してください。処理はすべてブラウザ内で完結しています。
SELECT クエリの95%で登場する句を、概念上の処理順に並べました。公式ドキュメント: PostgreSQL SELECT、MySQL SELECT。
| 句 | 役割 | 例 |
|---|---|---|
SELECT | 返す列や式を指定 | SELECT id, name |
FROM | 対象テーブルを指定 | FROM users |
JOIN ... ON | 別テーブルの行を結合 | JOIN orders ON orders.user_id = users.id |
WHERE | 集約前に行を絞り込む | WHERE active = true |
GROUP BY | 同じ値を持つ行をまとめて集約 | GROUP BY country |
HAVING | 集約後のグループを絞り込む | HAVING COUNT(*) > 10 |
ORDER BY | 結果を並び替え | ORDER BY created_at DESC |
LIMIT / OFFSET | 結果のページング | LIMIT 20 OFFSET 40 |
WITH ... AS | 共通テーブル式(CTE)でサブクエリに名前を付ける | WITH active AS (...) |
select id,name from users where active=true order by created_at desc limit 10SELECT id, nameFROM usersWHERE active = trueORDER BY created_at DESCLIMIT 10;各句が別々の行に分かれ、列リストがインデントされました。これだけでコードレビューでの読みやすさが10倍くらい違ってきます。
select u.name,o.total from users u join orders o on o.user_id=u.id where o.total>100SELECT u.name, o.totalFROM users uJOIN orders o ON o.user_id = u.idWHERE o.total > 100;テーブルにエイリアス(users u、orders o)を付けると列リストがすっきりします。JOIN ... ON の行があることで、テーブル同士の関係がはっきり見えるようになります。
select * from users where id in (select user_id from enrollments where course_id=5)SELECT *FROM usersWHERE id IN ( SELECT user_id FROM enrollments WHERE course_id = 5);内側のクエリをインデントすると依存関係が明確になります。構造が見えるようになると、サブクエリの多くは JOIN やCTEで書き直せることに気づくはずです。
LIMIT 10、T-SQLの TOP 10、標準SQLの FETCH FIRST 10 ROWS ONLY はどれも同じ意味ですが、書き方が違います。SELECT、FROM、WHERE)は大文字、識別子は小文字を推奨しています。視覚的なコントラストでクエリの構造が際立つからです。とにかくスタイルを一つに決めて、最後まで揃えるのが一番大事です。