SQLフォーマットとクエリの読みやすさ — インデント・大文字化の慣例
SQLはデータベースの操作言語で、整形されていないクエリは長さに関係なく非常に読みにくくなります。適切なフォーマット(インデント・キーワードの大文字化・改行)によって可読性を大幅に向上させ、デバッグや共同作業を効率化できます。
SQLフォーマットの慣例
SELECT・FROM・WHERE・JOIN・GROUP BY・ORDER BY・HAVINGなどのSQLキーワードは大文字で書くのが一般的です。列名・テーブル名・エイリアスは小文字またはスネークケースが多く使われます。各キーワードを新しい行の先頭に揃えるとSELECT節・FROM節・WHERE節が明確になります。チームによってはすべて小文字で統一するスタイルもあり、重要なのは一貫性です。SQLの行末セミコロンはサーバーへの送信時には不要ですが、複数クエリを1つのファイルにまとめる際は区切りとして必要です。コメントは-- 一行コメントまたは/* 複数行コメント */で追記できます。
インデントと複雑なクエリの整形
サブクエリ・CASE式・WITH句(CTE)などはインデントで入れ子構造を表現します。JOINが複数ある場合はON条件をJOINと同じ行またはインデントして続けます。長いWHERE条件はAND/ORで改行して揃えると読みやすくなります。SQL Formatterはこれらのフォーマット規則を自動適用します。CTEはWITH句でサブクエリに名前を付ける機能で、複雑なクエリを読みやすい段階に分解できます。CASE WHEN ... THEN ... ELSE ... ENDは縦に揃えると各条件が読みやすくなります。ORDER BY節は最後に配置するのが慣例です。
MySQL・PostgreSQL・SQLiteの方言
SQLには標準SQLの他にデータベースごとの方言があります。文字列結合はMySQLがCONCAT()・PostgreSQLが||・SQLiteが両方対応します。日付関数はデータベースによって大きく異なります。SQL FormatterはMySQL・PostgreSQL・SQLiteの構文を意識したフォーマットに対応しています。現在時刻の取得はMySQLがNOW()・PostgreSQLがNOW()またはCURRENT_TIMESTAMP・SQLiteがdatetime('now')です。LIMIT句はMySQL・SQLiteがLIMIT/OFFSET形式、PostgreSQLも同様ですがFETCH FIRST N ROWS ONLY(SQL標準)も使えます。MySQL固有の文法(REPLACE INTO、INSERT ... ON DUPLICATE KEY UPDATE)はPostgreSQLではINSERT ... ON CONFLICTで代替します。
パフォーマンスとインデックスの基礎
クエリのパフォーマンスはインデックスの有無に大きく依存します。WHERE句の条件に使うカラム・JOIN条件・ORDER BYのカラムにはインデックスを作成することを検討します。EXPLAIN(MySQL・PostgreSQL)でクエリの実行計画を確認し、フルスキャンが発生していないかを確認します。整形されたSQLはEXPLAINの結果と対応づけて理解しやすくなります。PostgreSQLではEXPLAIN ANALYZEで実際の実行時間を計測できます。インデックスは読み取りを高速化しますが、書き込み時のオーバーヘッドが発生するためやみくもに追加するのは避けましょう。N+1問題はEager Loading(JOINやSELECT ... IN)で解消し、不必要な複数クエリを1回に減らすのがORMパフォーマンス最適化の基本です。