SQL クエリをフォーマットする方法

· 7 分で読めます

整っていないSQLは、バグを生む最速の方法の1つです。クエリがインデントもなく1本の長い行になっていると、どの条件がどの結合に適用されるのか、サブクエリがどこで始まりどこで終わるのか、ロジックが正しいのかを把握するのが難しくなります。ブラウザベースのフォーマッターは、クエリをサーバーにアップロードせずに、整形作業全体をローカルで処理します。

整形が重要な理由

SQLを整形する手順

  1. SQLを貼り付ける: ミニファイされた、または乱雑なクエリをフォーマッタに入力します。SELECT、INSERT、UPDATE、DELETE、CREATE TABLE、サブクエリと結合を含む複雑なクエリを扱えます。
  2. オプションを設定: インデントサイズと、キーワードを大文字にするかを選びます。これらの設定はプロジェクトのスタイルガイドに合わせます。
  3. 結果をコピー: 整形されたSQLはエディタ、データベースクライアント、ドキュメントに貼り戻す準備ができています。

良い整形がもたらすもの

select u.name, o.total from users u join orders o on u.id = o.user_id where o.total > 100 and u.active = 1 order by o.total descのようなクエリは、次のようになります:

SELECT
  u.name,
  o.total
FROM users u
JOIN orders o
  ON u.id = o.user_id
WHERE o.total > 100
  AND u.active = 1
ORDER BY o.total DESC

各句は独立した行から始まります。条件は親の句の下にインデントされます。結合とそのON条件は明確にペアになっています。

SQL整形の慣習、簡単な歴史

SQLは1974年にIBMの研究者Donald ChamberlinとRaymond Boyceによって作られ、当初SEQUEL(Structured English Query Language)と呼ばれていました。元の名前の「QL」は、言語が英語のように読めるようにする意図を反映していました。最初から、この人間が読める設計は1つの慣習を暗示していました。文章のように上から下に読めるよう、句をインデントすることです。

1980年代と1990年代のほとんど、SQLはテキストエディタで手書きされ、整形は個人的なものでした。一部のショップは「リバースタイル」(すべてのキーワードが仮想列の右側で縦方向に揃う)を採用し、他は「エジプトスタイル」(中括弧を同じ行に置くスタイル)を使い、ほとんどは著者が好む形式を使いました。

最初に広く使われたSQLフォーマッタはApex SQL Formatter(2000年)で、DevartのSQL Complete(2002年)とRed GateのSQL Prompt(2003年)が続きました。これらのツールは、SQL ServerとOracleの開発者にIDEレベルの整形をもたらしました。2010年までに、すべての主要なIDE(SSMS、DataGrip、DBeaver)に組み込みのSQL整形が備わり、オンラインフォーマッタが場当たり的なクリーンアップの標準になりました。

2017年にフォーマッタのエコシステムは、sql-formatter(npm)とともに移り変わりました。これは、現在ほとんどのブラウザベースのSQLフォーマッタを支えているオープンソースのJavaScriptライブラリで、本ツールにも含まれます。モダンなフォーマッタは方言の違い(MySQLのバックティック、PostgreSQLのウィンドウ関数、SQL Serverの角括弧)を扱い、一貫した設定可能な出力を生成します。

主要企業が使うSQLスタイルガイド

ほとんどのプロフェッショナルなコードベースは、公開された複数のSQLスタイルガイドのうちの1つに従います:

スタイルガイド由来主な慣習
Mozilla SQL StyleMozilla大文字キーワード、snake_caseの名前、2スペースインデント
GitLab SQL StyleGitLab Data Team大文字キーワード、小文字の名前、4スペースインデント、先頭カンマ
Holistics SQL StyleHolistics大文字キーワード、snake_case、2スペース、末尾カンマ
Simon Holywell SQL個人/人気「リバー」アラインメント、大文字キーワード
dbt SQL Styledbt Labs小文字キーワード(モダンな方言)、snake_case、先頭カンマ
PostgreSQL Wiki StylePostgreSQLコミュニティ小文字キーワード、snake_case、K&Rスタイルのインデント

新規プロジェクトを始める場合は、確立されたガイドの1つを選んでください。既存のコードベースに加わる場合は、すでにあるものに従ってください。プロジェクト内での一貫性は、特定のスタイルよりも重要です。

よくある整形の選択肢

方言の違い

SQLフォーマッタは方言固有の構文を扱う必要があります:

方言特徴
PostgreSQLウィンドウ関数、LATERAL JOIN、ドルクォート文字列($$)、CTE中心のスタイル
MySQL / MariaDBバックティック識別子、LIMIT句の構文、REPLACE INTO
SQL Server(T-SQL)角括弧識別子、TOP句、OUTPUT句、MERGE
Oracle(PL/SQL)DUALテーブル、ROWNUM、階層的なCONNECT BY、ドットサフィックスのパッケージ呼び出し
SQLite限定的な型システム、REPLACE / UPSERT、単一ファイルデータベース
SnowflakeVariantデータ型、QUALIFY句、COPY INTO
BigQueryバックティック識別子、ARRAY / STRUCT型、EXCEPT / REPLACE列リスト
RedshiftPostgreSQL由来だが特徴的なDDL、S3からのCOPY

良いフォーマッタは方言ヒントを検出または受け入れ、他の方言が拒否する構文を扱います。

よくある落とし穴

使いこなしのヒント

プライバシーと機密クエリ

SQLフォーマッタは完全にブラウザ内で動作します。貼り付けたクエリ、中間処理、整形された出力はすべてデバイス上に留まります。サーバーへのアップロード、ロギング、第三者との共有は一切ありません。

これはSQLクエリが極めて機密性の高い情報を含むことが多いからです。製品アーキテクチャを明かすテーブル名、ビジネスロジックとメトリクスを露呈する列名、WHERE句にある実際の顧客ID、ストアドプロシージャ内の内部APIエンドポイント、テストデータ内のSSN(社会保障番号)とクレジットカード番号、人事クエリの従業員報酬、分析クエリの財務数値、マーケティングクエリの顧客メールアドレスなど。クラウド型のSQLフォーマッタは、リクエストログにすべてのクエリを記録し、ときには「サービス改善」のために保持し、貼り付けられた本番クエリが機密スキーマとデータを漏洩した実際の侵害事案に関与してきました。ブラウザベースのフォーマッタは露出ゼロで、クエリはマシンを離れません。

ブラウザベースの整形は、ページを一度読み込めばオフラインでも動作するため、飛行機の中、インターネットアクセスのないセキュアな環境、またはデータベースクエリを第三者のサービスに貼り付けてはいけない場所でクエリを整形するのに役立ちます。

よくある質問

SQL のキーワードは大文字で書くべきですか?

SQL のキーワード(SELECT、FROM、WHERE)を大文字で、テーブル名やカラム名を小文字で書くのは広く採用されている慣習です。クエリが視覚的に読みやすくなります。多くのスタイルガイドが推奨していますが、データベースエンジンが要求するものではありません。

フォーマットでクエリの実行が変わりますか?

いいえ。空白とインデントは SQL の実行に影響しません。フォーマットは純粋に人間の可読性のためです。ミニファイされたクエリとインデントされたクエリは同じ結果を返します。

どのインデントサイズを使うべきですか?

2 スペースも 4 スペースもどちらも一般的です。チームで使われているものを選び、一貫させてください。ほとんどの SQL フォーマッターはこの設定が変えられます。

SQL はサーバーに送信されますか?

いいえ。フォーマットは完全にブラウザ内で行われます。クエリがデバイスから出ることはありません。