kidoOooOoooOOom

ゲーム開発やってます

LEFT JOINとINNER JOINの挙動

今更ながら初めてSQLのJOINを使ったのでmemo。

  • INNER JOIN

INNER JOIN (内部結合)はそれぞれのテーブルの指定した列の値が一致するデータだけを取得する。基本の構文は次の通り。

SELECT テーブル名.カラム名, ... FROM テーブル名1
INNER JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2;

結合の対象となるテーブルをFROMの後とINNER JOINの後に指定し、ONの後に結合するカラムをイコール(=)で結んで指定する。
結合はそれぞれのテーブルの指定したカラムの値が同じものを1つのデータとして取得し、2つのテーブルで同じ値が存在しないデータは取得されない。

  • OUTER JOIN

OUTER JOIN (外部結合)は左右それぞれのテーブルの指定したカラムの値が一致するレコードに加えてどちらかのテーブルにしか存在しないデータについても取得する。LEFT JOIN は正確には LEFT OUTER JOIN を示す。

基本の構文は次の通り。

SELECT table_name.col_name, ... FROM tbl_name1
LEFT JOIN tbl_name2 ON table_name1.col_name1 = table_name2.col_name2;

外部結合では結合の対象となっているカラムの値が一致しているデータに加えて、カラムの値がどちらかのテーブルにしかなかった場合でもデータとして取得する。
このとき、LEFT JOINではFROMの後に書かれたテーブルのデータだけを取得し、RIGHT JOINではJOINの後に書かれたテーブルのデータだけを取得する。

  • 具体例

テーブル1のフィールド1に、



が、

テーブル2のフィールド1に、




が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               NULL

の3レコードが出力されるが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2

の2レコードしか出力されない。



参考URL
http://www.dbonline.jp/sqlite/join/index1.html
http://mathemathiko.hatenablog.com/entry/2012/06/08/201735
http://oshiete.goo.ne.jp/qa/746515.html