テーブルの結合について

※過去ブログの転記

 

今まで曖昧にしていた結合についてちゃんとまとめておく

内部結合INNER JOIN / 外部結合LEFT(RIGHT) OUTER JOIN

記述例

SELECT * 
FROM table1 
LEFT JOIN table2 
ON table1.field1 = table2.field2

要点

  • LEFT JOIN,RIGHT JOINLEFT OUTER JOIN,RIGHT OUTER JOINの省略形
  • JOINの条件は複数指定できる
  • 内部結合INNER JOINは結合先のテーブルに指定した条件と一致するレコードがなければ取得しない
  • 外部結合OUTER JOINは一致しないレコードも全て取得する

LEFTとRIGHTの違い

  • LEFTは結合先のテーブルを左に結合する
  • RIGHTは右に結合
FROM table1 LEFT JOIN table2 ON...

table1の左にtable2を外部結合するのでtable1のデータは全て取得する

FROM table1 RIGHT JOIN table2 ON...

table1の右にtable2を外部結合するのでtable2のデータは全て取得する

下記クエリはどちらもtable1の左にtable2を結合する

FROM table1 LEFT JOIN table2 ON...
FROM table2 RIGHT JOIN table1 ON...

補足

SELECT *
FROM table1 
LEFT JOIN table2 
ON table1.field1 = table2.field2

↓ 下と同じだけどJOINした方が処理が速かった

SELECT *
FROM table1,table2
WHERE table1.field1 = table2.field2

 

クロス結合CROSS JOIN

記述例

SELECT * 
FROM table1 
CROSS JOIN table2

要点

  • 2つ以上のテーブルで条件が一致したものを取得する
    (条件を指定した場合はINNER JOINと同じ?)

補足

条件指定なし
SELECT * FROM table1 CROSS JOIN table2

↓ 同じ

SELECT * FROM table1,table2
条件指定あり
SELECT * FROM table1 CROSS JOIN table2 ON table1.field1 = table2.field2

↓ 同じ

SELECT * FROM table1 INNER JOIN table2 ON table1.field1 = table2.field2

 

和結合UNION (DISTINCT) / UNION ALL

記述例

SELECT * FROM table1 
UNION /*UNION ALL*/
SELECT * FROM table2

要点

  • 2つ以上のSELECTの結合
  • デフォルトではUNION DISTINCT が実行される
  • UNIONで結合するテーブルは同じ列数じゃないといけない

CROSS JOINUNIONは正直具体的な恩恵が何かがわからないのであまり深く調べていない...
今まで使ったことがないし使いどころもいまいちわからない