カケル流SQL(SELECT文)の書き方(概要編)

今週は自分の本業であるSQLの書き方について書きます。

前提にも書きますが、あくまで僕の書き方はカケル流なので正解ではないのです。

ただ、僕が考えるロジックを文字に起こしたのでこれを繰り返していけば誰でもできると思ってます。

僕のSQL経歴はOracle、MySQL、PostgreSQL、SQLServer、Bigquery(LagacySql)、Bigquery(StandardSql)、Hadoopを扱っているのでSQLに関してはそこそこ強い人間と思ってます。

こちらはSQLを少し経験した向けで書いてあります。

SQLの前提について

SQLの書き方は正解が十人十色なです。
例: A in (1,2) と (A= 1 or A=2 )は同じ意味
例:if(A=1,1,0)とcase when A=1 then 1 else 0 endは同じ意味
数学ではなく、国語もしくは英語と考えてます
書き方はカケル流なので正解ではなく、カケルはこういう書き方するんだねくらいの参考にしてもらえたらと思います。

SQLを書く時の大きな要素はこちらです。

①必要なテーブルを確認 (from)
②抽出条件を入れる (where)
③カラムを書き方~その1~
④カラム名の書き方~その2~

⑤トラブルシューティング
⑥出力結果の確認

 

①必要なテーブルを確認 (from)

・作業を着手する前に必要なテーブル定義書を入手する

・新しい機能のデータ抽出の場合は事前に開発者に確認する
・主テーブル(Fromの後のテーブル)が何かを確認し、それを内部結合か外部結合化を確認する

結合方法

inner join(join):内部結合

left outer join:左外部結合

union all(縦に結合)

full outer join(外部結合)

②抽出条件を入れる (where)

・固定になっているものが多いので過去SQLを探して再利用する
例:where date between ‘$ysrtdt’ and  ‘$yenddt’

・条件が曖昧な時はまず出してみる。

・設計書を見てもわからない場合は担当者に認識合わせする

演算

= , in , <> , >= , <= , > , < , between , like , rlike , array_contains , is null ,を使う

③カラムを書き方~その1~

新しい計算式を使う場合は計算式自体が使えるのかを参照テーブルを使わずに確認する

hadoop:
select date_add(‘2018-03-01’,1) from dual
Big Query:
#standardsql
select date_add(‘2018-03-01’, interval 1 day)
Mysql:
select date_add(‘2018-03-01’, interval 1 day) from dual
oracle:
select date_add(‘2018-03-01’, interval 1 day) from dual
SQL SERVER
select dateadd(day , 1 , ‘2018-03-01’)

④カラム名の書き方~その2~

・2つの分岐が必要であれば「if」を使い、複数の場合は「case」
・DAUを算出する時はcount(distinct)  ※Bigquery lagacySQLの場合はexact_count_distinct
・金額の合計を算出する時はsum()
・平均を使う時はavg()
・最新情報がであればmax(date)、初課金のであればmin(date)
・1部の文字列を抜粋する時はsubstr
・カラムを連結する時はconcat

⑤トラブルシューティング

・エラーメッセージを英和の翻訳を使ってみる
・行数が出力されているのでそこを疑う  line:nn、[n:n]のようなエラーがあることが多いので
・サブSQL単位でSQLを流して実行できるかを確認する
・where句の条件を外して実行する
・select句のカラム数を減らして実行する
・select * from テーブル limit 10 で現物を確認する
・group by 句を外す

⑥出力結果の確認

カラム名を見て誰が把握ができるか?
cntよりもcountの方がわかりやすい
大枠で数値を出力して値の合計が一致しているかを検証 ※日別の合計は月別の合計と同じになっていることを確認
数値が合わない場合はdistinctされていない可能性がある
結合する箇所が良くない(金額は最後に結合すると無駄な行が減る)

数値が合わない場合は、明細を全部出しておかしいデータを特定して条件を変更する

(重複データがあるもしくはデータが不足している)

最後に

SQLはマラソンと同じとカケルは思ってます。

僕はハーフマラソンを完走した経験があるのですが、まずは3km走って慣れてきたら、5km、10km、20kmと徐々に距離を伸ばして本番に迎えました。

SQLも最初は5行、30行、50行、100行と徐々に書ける範囲を増やしていくと書けるようになります。

大学4年でSQLを初めて書いて今の仕事に至るので誰でも誰でも努力すればできると思ってます。

関連記事一覧

  • コメント ( 0 )

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。