達人に学ぶ SQL徹底指南書 12章 SQLプログラミング作法

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

12 SQLプログラミング作法

  • 汚いコードに苦しめられたか…

目次

  • はじめに
  • テーブル設計
    • 名前と意味
    • 属性と列
  • コーディングの指針
    • コメント
    • インデント
    • スペース
  • 大文字と小文字
    • カンマ
    • ワイルドカードは使わない
    • ORDER BYで列番号は使わない
    • 標準語を話そう
      1. 実装依存の関数・演算子を使わない
      2. 結合には標準の構文を使う
    • 左派と右派
    • 相関サブクエリを追放せよ
    • FROM句から書く
  • まとめ
    • 参考文献
      1. Joe Celko『Joe Celko's SQL Programming Style』
      2. Brian W.Kernighan, P.J.Plauger『プログラム書法 第2版』
      3. Steve McConnell『CODE COMPLETE 第2版 完全なプログラミングを目指して』
    • 参考文献
      1. Brian W.Kernighan, Rob Pike『プログラミング作法』
      2. Bill Karwin『SQLアンチパターン
      3. ミック『達人に学ぶDB設計 徹底指南書』

はじめに

  • 誰が見ても読みやすく間違いの少ないコードを書くにはどうすればいいか
  • SQLコーディングスタイル

テーブル設計

名前と意味

  • 名が体を表す具体的な名前を付ける

属性と列

  • 1つの列に複数の意味を持たせない

コーディングの指針

コメント

  • なるべくコメントはあった方がよい
    • 短いコードに多くの処理が凝縮されているので、コードを見て処理がわかりにくいため
    • 段階的な実行デバッグができないため
  • コメントの種類
    • 1行コメント(--)
    • 複数行コメント(/**/)

インデント

  • こんなときに1段下げる
    • サブクエリ
    • SELECT句やGROUP BY句において列を複数指定するとき
  • 句の先頭合わせと末尾合わせ
-- 先頭合わせ
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
-- 末尾合わせ
SELECT
  FROM
 WHERE
 GROUP BY
HAVING
 ORDER BY

スペース

-- ○良い見本
SELECT col_1
  FROM tbl_A A INNER JOIN tbl_B B
    ON A.col_3 = B.col_3
 WHERE ( A.col_1 >= 100 OR A.col_2 IN ( 'a', 'b' ) );
-- ×悪い見本
SELECT col_1
  FROM tbl_A A INNER JOIN tbl_B B
    ON A.col_3=B.col_3
 WHERE (A.col_1>=100 OR A.col_2 IN ('a','b'));
SELECT
    col_1
FROM
    tbl_A A INNER JOIN tbl_B B
    ON A.col_3 = B.col_3
WHERE
    (A.col_1 >= 100 OR A.col_2 IN ('a', 'b'));

大文字と小文字

  • 予約語は大文字
  • 列名やテーブル名は小文字
-- ○メリハリがあって読みやすい
SELECT col_1, col_2, col_3, COUNT(*)
  FROM tbl_A
 WHERE col_1 = 'a'
   AND col_2 = ( SELECT MAX(col_2)
                   FROM tbl_B
                  WHERE col_3 = 100 )
 GROUP BY col_1, col_2, col_3;
-- ×平たんで読みにくい:オール小文字
select col_1, col_2, col_3, count(*)
  from tbl_a
 where col_1 = 'a'
   and col_2 = ( select max(col_2)
                   from tbl_b
                  where col_3 = 100 )
 group by col_1, col_2, col_3;
-- ×平たんで読みにくい:オール大文字
SELECT COL_1, COL_2, COL_3, COUNT(*)
  FROM TBL_A
 WHERE COL_1 = 'A'
   AND COL_2 = ( SELECT MAX(COL_2)
                   FROM TBL_B
                  WHERE COL_3 = 100 )
 GROUP BY COL_1, COL_2, COL_3;

カンマ

  • 前カンマ
SELECT col_1
      ,col_2
      ,col_3
      ,col_4
  FROM tbl_A;
- 前カンマの利点
    1. 最後の要素を行ごと削除してもエラーにならない
    2. 矩形選択機能を適用しやすい
        - カンマがどの行でも同じ列位置に来るため

ワイルドカードは使わない

  • コードの可読性が下がる
  • 仕様変更に弱くなる
× SELECT * FROM SomeTable;
○ SELECT col_1, col_2, col_3, ... FROM SomeTable;

ORDER BYで列番号は使わない

  • コードの可読性が下がる
  • 仕様変更に弱くなる
  • 保守性が下がる
    • 「将来削除されるべき機能」のため
× SELECT col_1, col_2 FROM SomeTable ORDER BY 1, 2;
○ SELECT col_1, col_2 FROM SomeTable ORDER BY col_1, col_2;

標準語を話そう

  1. 実装依存の関数・演算子を使わない
  2. 結合には標準の構文を使う
    • INNERやCROSSといったキーワードで結合の種類を示す
    • 結合条件をON句に分離して書く

左派と右派

  • 左外部結合の方がわかりやすい

相関サブクエリを追放せよ

  • 可読性が下がる
  • パフォーマンスが下がる
  • デバッグが難しい

  • ウィンドウ関数で代替できるかも

FROM句から書く

  • SQLの実行順序に沿って書こう
  • SQLの実行順序

    • FROM
    • WHERE
    • GROUP BY
    • HAVING
    • SELECT
    • (ORDER BY)
  • 結合後の列名などわからないので、FROMから考えるしかないと思うのだが

まとめ

  • 読みにくいコードは何物も、誰も解決してくれない
  • パフォーマンスチューニングに負けず劣らず重要

    • プログラミングはコミュニケーションの一種
  • 参考文献(章末)

    1. Joe Celko『Joe Celko's SQL Programming Style』
    2. Brian W.Kernighan, P.J.Plauger『プログラム書法 第2版』
    3. Steve McConnell『CODE COMPLETE 第2版 完全なプログラミングを目指して』
  • 参考文献(本文中)
    1. Brian W.Kernighan, Rob Pike『プログラミング作法』
    2. Bill Karwin『SQLアンチパターン
    3. ミック『達人に学ぶDB設計 徹底指南書』

以上