purazumakoiの[はてなブログ]

技術メモから最近はライフログも増えてきてます。

JOINについてお勉強

SQLのJOINについてメモ。間違いもきっとあります。あしからず。

引用は全てこちらより
SELECT構文:JOINを使ってテーブルを結合する | Smart -Web Magazine

まずJOINとは

JOINは複数のテーブルを連結させるために用意されたキーワードです。単純にテーブルを連結させる以外にも、LEFT JOIN ONやUSINGなどの便利なキーワードがある

JOIN

(内部結合)
普通に結合する

SELECT purchase.id_c, id_p, fullname FROM customer JOIN purchase;

JOINにはオプションの構文がある

これから紹介するオプションで重要なのは、LEFT JOIN ON、USING、NATURAL LEFT JOIN までです。STRIGHT JOIN を使う機会はほとんどありませんし、RIGHT JOIN、INNER JOIN は余分です。

まとめると

  • 「LEFT JOIN」、「USING」、「NATURAL LEFT JOIN」の3つを抑える
  • STRIGHT JOIN を使う機会はほとんどありません
  • 「RIGHT JOIN」、「INNER JOIN」は、とりあえず無視

LEFT JOIN

外部結合
JOIN(内部結合)だと、
条件にマッチしなかったやつは全く取得されないので
片方のテーブルに指定条件のレコードがなくてもNULLとして、とりあえず表示はする
ということが出来る

USING

USINGとは

USING句は、ON句の略記法で、結合する条件が同じ名前のフィールド名であれば、USINGで結合条件を指定することができます。USINGの引数に指定したフィールド名で、テーブル間のリレーションを作成します。

つまるところ
簡単なやつはONで条件指定をするけど、長くなることがあるので
USING句を使うとそれをスマートに書くことが出来るようだ

# USING を使った構文
SELECT * FROM A LEFT JOIN B USING (F1)

# ON 条件式を使った構文
SELECT * FROM A LEFT JOIN B ON A.F1=B.F1

条件を複数指定したい場合はカンマで区切る

# USING を使った構文
SELECT * FROM A LEFT JOIN B USING (F1, F2, F3)

# ON 条件式を使った構文
SELECT * FROM A LEFT JOIN B ON A.F1=B.F1 AND A.F2=B.F2 AND A.F3=B.F3,...

NATURAL LEFT JOIN

NATURAL(自然結合)とは

同じフィールド名を持つ2つのテーブルの NATURAL [LEFT] JOINは、 USINGを伴ったINNER JOINやLEFT JOINと同じです。

つまり
LEFT JOINとかにNATURALをつけるとUSINGを使ったのと同じことが出来るということかな

こんな風にかく

SELECT id_p, fullname FROM customer
NATURAL LEFT JOIN purchase;

この場合は
customerテーブルとpurchaseテーブルを両方のテーブルに存在する「id_cフィールド」を条件に結合されるってことかな

STRAIGHT JOIN

STRAIGHT JOINとは

STRAIGHT JOIN は、常に左側のテーブルを先に読むことを除けば、JOIN と同じです。これは、不当な順序でテーブルを出力するようなまれな事態に有効ですが、ほとんどの場合は必要ありません。

んー。例えば
customerテーブルを先に見て、それに紐づくpurchaseテーブルの情報をみたい!
と明確に示したい時に使うのかな。
そうしないと、
purchaseテーブルをみて、それに紐づくcustomerテーブルを見るって言う風にmysqlが勝手にやっちゃうからと



ただ、これSTRAIGHTはちゃんと使わないとかえって重くなる。
ちゃんとしたインデックス貼ってとか
MYSQLがJOINをどういう風にやってるかの流れを追った上で使うやつで・・・
ってことかな
via
MySQL のJOIN に関するメモ - Slow Dance

INNER JOIN

INNER JOINとカンマ( , )は、同義語で、通常のJOINの別名です。

要はJOINと同じ機能だけど、内部結合ですよ!ってのをわかりやすく示せそう。

OUTER JOIN

これも
LEFT JOINって書くと外部結合てわかりにくいから
LEFT OUTER JOIN って書くことも出来るよってことかな。