SQL勉強した感想

前提

感想

  • https://github.com/knknkn1162/sql_recipies/tree/main この辺でまとめている。
    • 実装、メモとして情報を残すにあたりjupyter notebookを使うのが便利だった
  • SQL関数プログラミングに近いが、命令が限定的なので通常のプログラミング言語ともまた違う考え方が必要
    • 集合ベースの言語。自分的には価値観が広がって非常に良かった。
      • ただ普通のプログラミング言語とは違って命令セットが貧弱なので、やや縛りプレイで実装している感はある
        • CSVなどファイルベースで、それほどサイズが大きくない場合はRかPowerShellかなぁ。group byやより複雑な実装を必要とする場合はRでそれ以外だったらPowerShellでも十分。ただ、インタプリタなのでどちらも速度は遅め。
    • SQLやっぱり難しいよね..?
      • 少なくとも非エンジニアが相関サブクエリをササッとかけるとは思えない。かといってテーブル設計もやはり非エンジニアにとっては難しい
  • 複雑な要件に対しては相関サブクエリを書く必要がある。相関サブクエリを制するものは(高度な)SQLを制する。
    • ウィンドウ関数で一部は代替できる(全てではない)。実装は相関サブクエリよりも簡単になりがちなので逃げずにマスターはしておきたい。
    • 考え方のコツは外側のスコープのテーブルを1つ固定した状態で、相関サブクエリ内のスコープのテーブルの結果を考えれば良い
      • 偏微分的な思考に近い。
      • また、2重ループ(相関サブクエリの入れ子なら3重ループ)と見て、(相関サブクエリの)外側のループの変数が固定されている状態で、(相関サブクエリの)内側のループの変数が動く、というように思って実装する。
    • 基本的なクエリ(select .. from where .. group by .. having ..など)を理解して、達人に学ぶSQL徹底指南書 第2版を頑張って読もう。(これが読めないとSQLパズルは無理)。
      • SQLパズルは難しいが、最初の3問~10問くらいを乗り越えさえすれば、その後は割とスムーズに進められる。写経はせず自身で考えて行く方が良いと思う
    • case式自体は式として使える(文ではない)。応用範囲こそ広いものの、所詮はX^n -> X^n写像なのでやってることはシンプル。
      • 集約関数の中にcase式を使うやり方は応用範囲が広い
        • case式をX^n -> {0,1}^n写像として使う(上記で紹介した本では特性関数という名前として使われている)とかはよくある解法パターン
      • ただifを組み合わせる実装なので、プログラミングに慣れている人は気持ち悪いかも
      • 列持ち <-> 行持ちの変換についてはSQLよりもRやPythonの方が便利。Rだとpivot_wider/pivot_longer(Pythonだとpivot)がある
  • where句の中にサブクエリを書く他に、selectやhavingでサブクエリを書くのにも慣れておこう。こちらも応用範囲は広い
  • 期間に関連するSQLクエリは難しくなりがち
    • ウィンドウ関数でできればベスト
    • 3つの同じテーブルを使って自己結合or相関サブクエリを実装する必要がある場合が多い
      • 外側の2つのテーブル(from tb as tb1, tb as tb2)をそれぞれ開始、終了と見て、サブクエリ内のテーブル(tb as tb3とする)を開始~終了の間で動く変数と考えると実装しやすい(select * from tb as tb1, tb as tb2 where ... and not exists (select * from tb as tb3 where tb3.date between tb1.date and tb2.date) ...みたいな感じ)