SQLをレイアウトする?

  • 業務システムのプログラムコーディングしていると言語を問わずSQL文を組み立てる場面があります。
  • 私の周りではみんな独自色…もちろん私もその一人ですが。
  • それなりにルールがあって、見やすければ良いとは思うのですが、全然お構いなしですごく見づらいケースもありますよね。


SQLなDBMS暦

  • かかわり度合いは違いますがこんな感じです。DB2やInfomixは触れてません。。。
  1. ACCESS(DBMS?)
  2. SQL Server6.5あたり
  3. Oracle7.3あたり
  4. MSDE(たしかSQLServer7あたり?)
  5. Oracle8i,9iあたり
  6. Oracle10g
  7. MySql4.1~5あたり
  8. PostgreSQL8ぐらい
  9. SQL Server Express 2005
  • もっと前は汎用機/オフコンのDBや、DOS時代のBtrieveも触ったけど、SQLではありませんでしたね…

現在のマイルール

  1. SELECTは単独記述
  • Oracle時代はヒント書く場所にしていたので、そのなごりかと。
  • SELECTに続けて列を記述していた時期もありますが。
  1. 列を列挙する場合は1行1列.カンマは前に置く
  • コメントアウト時、列追加時に、該当行のみ変更で済むので。
  • 当然、先頭に列を追加する場合は複数行変更することになりますが…経験上それは少数派。
  1. 予約後を大文字で記述する
  • これは最近。Oracle7~9時代は全部大文字で書いていました。
  1. 真ん中に合わせる
  • SELECT、FROM、WHEREなどを右側で揃える。下記のサンプル参照。
SELECT
       tb1.column1
  FROM table1 tb1
 WHERE tb1.column3 = 123
 GROUP BY tb1.column1
  1. テーブルは必ず別名
  • なにかの記事で、そうすることで僅かだがパフォーマンスが上がると見かけたので始めた。((多分パースが早くなるのだと思われますので、現在の高性能サーバ機では微々たるものかも))
  • 最近は単一テーブルのSELECTでも記述する。後になってJOINするケースはしばしばありますが、そのときに初めて別名をつけると変更箇所が増えてしまうので。
  1. JOIN ~ ON の条件は左側にJOINするテーブルの列を記述
  • 右側に記述すると固定値や別テーブル列を条件とする場合、美しくない。
  • そもそも左側に比較対象を記述するっていうのがおかしいと思っている。
  • コードでも if ( 1 == value ) …って書くケースを見かけます((間違って代入してバグの元になるから?))が許せないタイプです。

FROM以下の記述例

 FROM table1 tb1
 LEFT JOIN table2 tb2
      ON   tb2.column1 = tb1.column1
      AND  tb2.column2 = 1            /* OK! */
 LEFT JOIN table3 tb3
      ON   tb1.column1 = tb3.column1
      AND  1 = tb3.column2            /* リテラルを左辺に記述するのは美しくない! */
 LEFT JOIN table4 tb4
      ON   tb1.column1 = tb4.column1  /* JOINテーブル列を左辺記述統一していないので美しくない! */
      AND  tb4.column2 = 2

facebook slideshare rubygems github qiita