hirapi's blog

ちゃんとしたふりをする

『SQLアンチパターン』を読んだ③「III部 クエリのアンチパターン」

毎日1〜2個読んで、本文や調べたことをnotionにまとめていたのだけど、せっかくなのでその一部をこちらにも転記する。
引用の域を超えてしまうので本の内容をまとめた部分は端折って、感想とその周辺の最低限の内容だけを転載。

これまで:

hirapi.hatenablog.jp

hirapi.hatenablog.jp

メッセージ

  • インデックスをきかせるクエリを書く
  • 「〜は駄目」と決めつけずにいろんな方法を検討する
    • 「NULLは駄目」「クエリ数が多いのは駄目」
  • 集約や結合が多いクエリは結果を確認する(例題からの学び)

各章

13. フィア・オブ・ジ・アンノウン(恐怖の unknown)

  • NULLは「わからない」
    • わからないとわからないが同じかはわからない NULL = NULL ⇒ NULL
  • 論理式
    • NULL AND TRUENULL
    • NULL AND FALSEFALSE ← いやいやいや 🤔
    • NULL OR FALSENULL ← いやいやいや 🤔
    • NULL OR TRUETRUE
    • NOT(NULL)NUL
  • COALESCE()
    • 一番うしろに必ず非NULLのリテラル値を入れておけば、他の引数がnullableでも安心して使える
    • 使いこなせたらかっこよさそう( RubyObject#tap 的な)

14. アンビギュアスグループ(曖昧なグループ)

15. ランダムセレクション

  • 再現性・決定性
    • 再現性:同じ手続きをすると同じ結果が得られる
    • 決定性:入力によって一意に出力が定まる
  • テーブルスキャン:インデックスを使わない検索
  • ORDER BY RAND() こんなやり方があるのか……(アンチパターン
  • 解決策:ランダムな主キー値を使う
    • 例題見たとき最初に思ったやつだ
    • 連番じゃない主キーもある、欠番もあるので注意。なるほど
  • 解決策:IDのリストをアプリケーションに読み出してランダムに選び、SELECTし直す
    • たしかにこっちのほうが安全なのか
  • ウインドウ関数、MySQL8.0からあるんだ 👀 使ってみたい

16. プアマンズ・サーチエンジン(貧者のサーチエンジン)

17. スパゲッティクエリ

  • デカルト積(直積):全組み合わせ(↓直積集合 - Wikipedia

    二つの集合 A, B に対し、それらの直積とはそれらの任意の元 a ∈ A, b ∈ B の順序対 全てからなる集合

  • UNIONたぶん仕事でつかったことない
    別々に取得したデータを結合して取得する(UNION句)

  • 似たような状況(広告のレポート)ではCASE式をよくつかっていた気がする
  • カラムの値によってレコード毎に異なるクエリを発行したいとき
    • SELECT CONCAT('UPDATE tableA ', 'SET name = ', tableB.name) でUPDATE文をレコード分自動生成できる、とのこと
    • なるほど〜〜〜、いつか使いたい

18. インプリシットカラム(暗黙の列)

  • SELECT時のワイルドカードは駄目ってよくいわれてたけど、INSERT時のカラム指定はちゃんとやってたか自信無い……
  • メタデータも変わりうる