SQL (frozen)

結合(join)

  • 結合の種別
    • (INNER) JOIN: 内積
    • LEFT (OUTER) JOIN: 左は、右に一致が無くとも全て含める
    • RIGHT (OUTER) JOIN: 右は、左に一致が無くとも全て含める。SQLite3 は未サポート
    • FULL OUTER JOIN: いずれかに一致が無くとも全て含める。MySQL や SQLite3 は未サポート
    • CROSS JOIN: 条件がなければ直積(全組み合わせ)。FROM 句にテーブルを列挙した際には、これ。PostgreSQL, MySQL 等で ON, USING を伴うと、(INNER) JOIN と等価
  • 結合の条件(汎用順)
    • ON: WHERE 句と同じ表記で条件を指定する
    • USING(column): 両テーブルの同名のカラムどうしの突合を条件とする
    • NATURAL: 同名の全てのカラムが同値であることを条件とする

結合のアルゴリズム

  • Oracle SQLチューニング講座(3):SQLチューニングの必須知識を総ざらい(後編) (1/3) - @IT
  • 主要 3 つ
    • Nested Loop Join
      • 小さい外表(outer table であって、external table とは何の関係も無い)のループ内で大きい内表(inner table)を回して結合する。最も一般的
      • 内表の結合列にインデックスが張ってないと悲劇に
    • Sort Merge Join
      • 結合列でソートしたどうしを上からマージして行く。ソート済みでないとオーバーヘッドがデカいが、メモリをバカ食いしない。
    • ハッシュジョイン
      • 小さい方のテーブルの結合列から結合可能なハッシュ値一覧を作って、大きい方との突き合わせを行う。オーバーヘッド小。
  • Oracle は基本、この 3 つ。
  • PostgreSQL もその 3 つ: PostgreSQL: Documentation: 9.2: Planner/Optimizer
  • MySQL は NLJ だけかな?
  • ビットマップインデックスだのはカーディナリティの問題で、結合と直接は関係ないからね

その他

coalesce (co·a·lesce /kòʊəlés/) … 「コウアレス(チェ)」とでも覚えれば良い。

Comments