『SQLアンチパターン』を読んだ③「III部 クエリのアンチパターン」
毎日1〜2個読んで、本文や調べたことをnotionにまとめていたのだけど、せっかくなのでその一部をこちらにも転記する。
引用の域を超えてしまうので本の内容をまとめた部分は端折って、感想とその周辺の最低限の内容だけを転載。
これまで:
メッセージ
- インデックスをきかせるクエリを書く
- 「〜は駄目」と決めつけずにいろんな方法を検討する
- 「NULLは駄目」「クエリ数が多いのは駄目」
- 集約や結合が多いクエリは結果を確認する(例題からの学び)
各章
13. フィア・オブ・ジ・アンノウン(恐怖の unknown)
- NULLは「わからない」
- わからないとわからないが同じかはわからない
NULL = NULL
⇒ NULL
- わからないとわからないが同じかはわからない
- 論理式
NULL AND TRUE
⇒NULL
NULL AND FALSE
⇒FALSE
← いやいやいや 🤔NULL OR FALSE
⇒NULL
← いやいやいや 🤔NULL OR TRUE
⇒TRUE
NOT(NULL)
⇒NUL
COALESCE()
14. アンビギュアスグループ(曖昧なグループ)
- 単一値の原則:取得される行の値は単一でなければいけない
MAX(date)
は一意に定まるが、idは複数の選択肢がある
- 相関サブクエリ:サブクエリ内で外部クエリを参照するようなクエリ
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.10.6 EXISTS または NOT EXISTS を使用したサブクエリー GROUP_CONCAT(col)
- 全選択肢をカンマ区切りの文字列で取得できる
- こんなのあるんだ
15. ランダムセレクション
- 再現性・決定性
- 再現性:同じ手続きをすると同じ結果が得られる
- 決定性:入力によって一意に出力が定まる
- テーブルスキャン:インデックスを使わない検索
ORDER BY RAND()
こんなやり方があるのか……(アンチパターン)- 解決策:ランダムな主キー値を使う
- 例題見たとき最初に思ったやつだ
- 連番じゃない主キーもある、欠番もあるので注意。なるほど
- 解決策:IDのリストをアプリケーションに読み出してランダムに選び、SELECTし直す
- たしかにこっちのほうが安全なのか
- ウインドウ関数、MySQL8.0からあるんだ 👀 使ってみたい
16. プアマンズ・サーチエンジン(貧者のサーチエンジン)
[[:<:]]
[[:>:]]
単語の境界を表す正規表現らしい
MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5.2 正規表現
17. スパゲッティクエリ
デカルト積(直積):全組み合わせ(↓直積集合 - Wikipedia)
二つの集合 A, B に対し、それらの直積とはそれらの任意の元 a ∈ A, b ∈ B の順序対 全てからなる集合
UNIONたぶん仕事でつかったことない
別々に取得したデータを結合して取得する(UNION句)- 似たような状況(広告のレポート)ではCASE式をよくつかっていた気がする
- カラムの値によってレコード毎に異なるクエリを発行したいとき
SELECT CONCAT('UPDATE tableA ', 'SET name = ', tableB.name)
でUPDATE文をレコード分自動生成できる、とのこと- なるほど〜〜〜、いつか使いたい