『俺的コーディングルールSQL編』によせて

『俺的コーディングルール SQL編』に刺激を受けて
私のSQLの書き方を紹介します。

紹介されている書き方と比較したらわかりやすいと思うので、
まずは上記のサイトで紹介されている書き方を以下に。

select
  f1.ID,
  f1.ITEM1,
  f1.ITEM2,
  f2.ITEM3,
  m1.USER_ID,
  m1.USER_NAME
from
  table_head f1,
  table_detail f2,
  user_master m1
where not exists (
  select 1 from tableXXX s1
  where s1.ID = f1.ID
)
  and f1.ID = f2.ID
  and f2.USER_ID = m1.USER_ID
  and f2.ITEM3 = 'xxx'
order by m1.user_id, f1.id, f1.item, f2.item

同じSQLなら、私は以下のように書いています。

select
	thd.ID,
	thd.ITEM1,
	thd.ITEM2,
	tdl.ITEM3,
	ums.USER_ID,
	ums.USER_NAME
from
	TABLE_HEAD	thd
inner join	TABLE_DETAIL	tdl
	on	thd.ID		=	tdl.ID
inner join	USER_MASTER	ums
	on	tdl.USER_ID	=	ums.USER_ID
where
	not exists(
	select
		*
	from
		TABLEXXX	txx
	where
		txx.ID	=	thd.ID
	)
and	tdl.ITEM3	=	'xxx'
order by
	ums.USER_ID,
	thd.ID,
	thd.ITEM,
	tdl.ITEM

ポイントは以下のとおり。

  • タブインデント
    • 理由:慣れの問題ですが、私はこちらの方がインデント操作が早くできます。ユーザからの急な要望を受けてやっつけでクエリ発行するときでも、それなりの体裁が整えやすいので後から見てわかりやすいです。(でもエディタによってはタブをスペースに変換できたりするので、ここにこだわる必要はないかもしれません。)
  • 結合はJOIN
    • 理由:ANSI準拠の書き方ということもありますが、結合条件と抽出条件をはっきりわけることができる上、プログラムからSQLを生成する場合など、結合単位をブロック化することができてコーディングがスッキリするというメリットがあります。Oracleも9iからJOINに対応していますが、マニュアルでもJOIN句による結合を推奨しています。
  • 後ろカンマ
    • 理由:これも慣れでしょうか。私にとっては前カンマよりも後ろのほうが見やすく感じます。確かに後で項目を追加する場合にカンマを忘れたりすることはありますが(^_^;)、やっぱり前カンマはちょっと気持ち悪い。
  • テーブルの別名はわかりやすく
    • 理由:テーブルがUSER_MSTならumsとか、3文字の略字で表します。他の人から見ても可読性が工場します。3文字と決めているのは、項目を並べたときにツラをあわせるためです。