達人に学ぶ SQL徹底指南書 12章 SQLプログラミング作法
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2018/10/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
12 SQLプログラミング作法
- 汚いコードに苦しめられたか…
目次
- はじめに
- テーブル設計
- 名前と意味
- 属性と列
- コーディングの指針
- コメント
- インデント
- スペース
- 大文字と小文字
- まとめ
はじめに
- 誰が見ても読みやすく間違いの少ないコードを書くにはどうすればいいか
- 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;
標準語を話そう
- 実装依存の関数・演算子を使わない
- DECODE(Oracle)
- IF(MySQL)
- NVL(Oracle)
- STUFF(SQL Server)
- 結合には標準の構文を使う
- INNERやCROSSといったキーワードで結合の種類を示す
- 結合条件をON句に分離して書く
左派と右派
- 左外部結合の方がわかりやすい
相関サブクエリを追放せよ
- 可読性が下がる
- パフォーマンスが下がる
デバッグが難しい
ウィンドウ関数で代替できるかも
FROM句から書く
- SQLの実行順序に沿って書こう
SQLの実行順序
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- (ORDER BY)
結合後の列名などわからないので、FROMから考えるしかないと思うのだが
まとめ
- 読みにくいコードは何物も、誰も解決してくれない
パフォーマンスチューニングに負けず劣らず重要
- プログラミングはコミュニケーションの一種
参考文献(章末)
- Joe Celko『Joe Celko's SQL Programming Style』
- Brian W.Kernighan, P.J.Plauger『プログラム書法 第2版』
- Steve McConnell『CODE COMPLETE 第2版 完全なプログラミングを目指して』
- 参考文献(本文中)
以上