コンテンツにスキップ

02.SQL コーディング規約

このドキュメントでは、SQL(Structured Query Language)を記述する際のスタイルと規約を定めます。可読性と保守性の高いクエリ記述を目指します。

Note

"共通原則との関係" 本規約は、01.共通コーディング原則の思想を、SQLに特化・具体化したものです。必ず共通原則にも目を通してください。


1. 基本方針 (Guiding Principles)

  • キーワードは常に大文字:
    • SELECT, FROM, WHERE, GROUP BY, JOIN などのSQL予約語は、必ず大文字で記述します。
  • データ型も大文字:
    • VARCHAR, INTEGER, TIMESTAMP などのデータ型も大文字で記述します。
  • 関数名も大文字:
    • COUNT(), SUM(), NOW() などの組み込み関数名も大文字で記述します。

なぜ大文字か?

SQLの予約語や関数を大文字に統一することで、テーブル名やカラム名といった、私たちが定義した「識別子」との区別が明確になり、クエリの構造が格段に読みやすくなります。


2. レイアウトと書式設定 (Layout and Formatting)

手作業でのスタイル遵守は非効率であり、レビューのノイズとなります。本プロジェクトでは、ツールによって規約の遵守を強制します。各ツールの設定は、リポジトリのルートに配置された .sqlfluff ファイル(SQL専用フォーマッター・リンター設定)、および package.json ファイル(依存関係・スクリプト管理)で一元管理します。また、エディタレベルでの基本的な設定は .editorconfig ファイルで統一します。

  • フォーマッター:
    • 役割: インデント、スペース、キーワードの大文字化などを自動で統一します。
    • 推奨ツール:
      • SQLFluff: SQL専用のリンター兼フォーマッター。多くのSQL方言をサポートし、詳細な設定が可能です。
      • Prettier (with SQL plugin): Web開発で利用しているPrettierにSQLプラグイン (prettier-plugin-sql) を追加することで、SQLファイルも同じツールでフォーマットできます。
      • その他、DataGripやDBeaverなどのSQLクライアントに内蔵されているフォーマッターも活用します。

!!! success "CI/CDによる自動チェック" - GitHub Actionsのワークフローにsqlfluff lintおよびsqlfluff format --checkを組み込むことで、SQLファイルのフォーマットとスタイルが規約に違反しているコードのマージを自動的にブロックします。- SQLクライアントツールの自動フォーマット機能を活用することを推奨します。


3. フォーマットとインデント (Formatting and Indentation)

  • インデント:
    • JOIN句やサブクエリなど、階層が深くなる場合は、半角スペース2つまたは4つでインデントします。(プロジェクト内で統一)
  • 主要な句は改行:
    • SELECT, FROM, WHERE, GROUP BY, ORDER BY などの主要な句は、それぞれ新しい行から書き始めます。
  • カンマの位置:
    • SELECT句のカラムリストなどは、カンマを要素の前に置く「リーディングカンマ」スタイルを推奨します。これにより、コメントアウトや項目の追加・削除が容易になります。

良い例 (リーディングカンマ):

SELECT
    u.id
  , u.name
  , u.email
  , COUNT(p.id) AS post_count
FROM
    users AS u
LEFT JOIN
    posts AS p ON u.id = p.user_id
WHERE
    u.is_active = TRUE
    AND u.created_at >= '2023-01-01'
GROUP BY
    u.id
  , u.name
  , u.email
ORDER BY
    post_count DESC;

4. 命名規則 (Naming Conventions)

この命名規則は、02.設計仕様/02.データ仕様/01_データモデル設計書で定義されるルールと一致させます。

  • テーブル名:
    • 小文字のスネークケース (snake_case) を使用します。
    • テーブルが表すエンティティの複数形とします。(例: users, posts, order_items
  • カラム名:
    • 小文字のスネークケース (snake_case) を使用します。
    • id や、外部キーを示す user_id のような、明確で一貫性のある名前を付けます。
  • エイリアス (別名):
    • テーブルやカラムにエイリアスを付ける場合は、ASキーワードを明記することを推奨します。
    • エイリアス名は、元の名前の頭文字など、短く分かりやすいものにします。(例: users AS u, posts AS p

5. その他 (Miscellaneous)

  • JOINの明示:
    • JOINを記述する際は、INNER JOIN, LEFT JOIN のように、結合の種類を常に明示します。単にJOINと書くのは避けてください。
  • ワイルドカード (*) の不使用:
    • SELECT * は、意図しないカラムの取得やパフォーマンス低下の原因となるため、原則として使用を禁止します。
    • 必ず、取得したいカラム名を全て明示的に記述してください。
  • コメント:
    • 複雑なクエリや、特定のロジックには、--(一行コメント)や /* ... */(複数行コメント)を使って、その意図を説明するコメントを記述します。