はじめに
本棚に眠っていた達人SQLの本を読み直し、この書き方自分にも使えそうだなと思うものや、実務で使った書き方がいくつかあったので、個人用に簡単にまとめました。
本書では「リーダブルコード」のSQL版みたいな箇所やチューニングなどについても記載されていますが、そこは省きます。
目次
・CASE式
・ウィンドウ関数
・自己結合
・HAVING句
CASE式
SELECT
CASE WHEN REGION = '1' THEN NUMBER ELSE 0 END AS TOKYO
CASE WHEN REGION = '2' THEN NUMBER ELSE 0 END AS OSAKA
FROM JAPAN
-
何か
- 取得結果から取得条件をさらに追加する
-
用途
- 複数の取得条件がある場合にSQLを複数書かなくても一つで完結できる
- 汎用性が高い
- 使い方によっては処理速度の向上が可能(チューニング)
- 複数の取得条件がある場合にSQLを複数書かなくても一つで完結できる
ウィンドウ関数
関数名 OVER (
PARTITION BY 列名 -- 指定した列をグループ化
ORDER BY 列名 -- 順番の入れ替え
RANGE|ROW BETWEEN -- 指定範囲を選択する
)
-
何か
- 一部の行毎に対して、集計した結果を表示するSQL
- 出力結果は対象レコードも全て表示される
- 下記ブログの解説がわかりやすかったです
https://laboratory.kiyono-co.jp/462/date_analytics/
-
用途
- 集計結果の内訳を表す際に重宝しそう
- 抽出した内訳データの前後比較にも使用
-
注意点
- 実行計画はソートのため、チューニング対応によっては早くなったり遅くなったり分かれる
自己結合
SELECT SEME.name AS seme, MAMORI.name AS mamori
FROM Janken SEME INNER JOIN Janken MAMORI
ON hoge
-
何か
- 対象1テーブルを複数テーブルのように扱う
-
用途
- 1テーブル内で組み合わせパターンを出力したい場合に使用
HAVING句
SELECT hoge
FROM Hoge
GROUP BY hoge
HAVING COUNT(*) = COUNT(hoge);
-
何か
- グループ化したデータに対して、さらに条件を追加する
-
用途
- WHERE句では絞り込めない具体的な抽出パターンがある際に使用
さいごに
改めて読み直してみると参考になる箇所が多くありました。
テーブル加工するSQL文もあったので、実務で使う機会があれば再度読み直して参考にさせていただこうと思います。