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 以外
面倒なのでまた暇があれば。