SQL の命名規約とフォーマット

ときどきの雑記帖さん経由で、私のSQLフォーマットをみて、自分の規約もさらしてみる*1 *2

命名規約

  • テーブルやビュー、共通表式は Pascal 記法で、複数形とする*3。例えば、Employees とか Works とか
    • ただし、リレーションテーブルはその限りではない。例えば、EmployeeWork とか
  • カラム名はアンダーバー区切りで、単数形を基本とする。例えば、name とか
  • 人工キーを使用する場合、
    • 自身の人工キーは id とする
    • 外部キーはテーブルの頭文字の小文字 _id を付けたものとする。例えば、e_id とか
      • 重複する場合は・・・決めてない (ぉ
  • テーブルに別名を付ける場合、テーブル名の単数形を使用する
  • 自己結合等でテーブルの区別が必要な場合、子テーブル側に C と付ける
    • 孫には GC、GGC と付けていく (実際、そんなに深い自己結合なんてしないけど)

フォーマット

インデント、カンマ
  • インデントはトップレベルはスペース 4 つ、それ以降は基本スペース 2 つ分とするが、タブは使用しない
  • カンマはカラム名の前に置き、インデントの一部として考える
SELECT
    Employee.id AS employee_id
  , Employee.name AS employee_name
  , Work.id AS work_id
  , Work.name AS work_name
FROM
    Employees Employee
      INNER JOIN Works Work ON Employee.id = Work.e_id
;
関数
  • 関数は大文字で記述する。例えば、MAX(hoge) とか COALESCE(piyo, '') とか
  • ユーザ定義関数の使用をためらわない*4
SELECT 等、トップレベルの要素
  • 基本的に単一行に記述する
  • サブクエリの場合、逆に単一行には記述しない
    • サブクエリは簡単なものしか記述しない
    • 複雑になる場合、共通表式やビューなどにくくりだす
SELECT
    Employee.name
FROM
    Employees Employee
WHERE
    NOT EXISTS(
      SELECT * FROM Employee C
      WHERE Employee.age < C.age AND Employee.id <> C.id
    )
;
JOIN
  • RIGHT OUTER JOIN は使用しない
  • OUTER を省略せず、常に LEFT OUTER JOIN と記述する
  • JOIN の条件は ON に記述する
条件式
  • 決まらない・・・
  • ON と WHERE/HAVING で書き方が違うような・・・
  • 読みやすく書く!
CASE 式
  • 必ず ELSE を記述する
  • ELSE は直前の THEN に合わせる
  • 単純 CASE 式固有
    • WHEN をインデントする
    • THEN は改行しない
  • 検索 CASE 式固有
    • WHEN をインデントしない
    • THEN を改行し、インデントする
-- 単純CASE式
SELECT
    CASE Employee.age
      WHEN 30 THEN 1
              ELSE 0
    END AS is_30
FROM
    Employees Employee
;
-- 検索CASE式
SELECT
    CASE
    WHEN Employee.age < 30
      THEN 1
      ELSE 0
    END AS is_under_30
FROM
    Employees Employee
;
SELECT 以外

面倒なのでまた暇があれば。

*1:未だに揺れ動く

*2:結構変態的かも

*3:例によく使ってる SomeTable だけど、実は規約違反w

*4:フォーマットとは関係ないな