2. Copyright 2016-2018 G1Systems Inc.
INNER JOIN と OUTER JOIN
2
2 C
生徒ID ランク
3 A
10 B
33 C
40 B
48 C
1石野 扶樹
ID氏名
2岩崎 研二
3岩間 竜也
4上野 浩介
5岡崎 雅之
6岡島 慶二
生徒マスタ 特待生マスタ
INNER JOIN と OUTER JOIN で、結果はどう変わる?
生徒マスタ a INNER JOIN 特待生マスタ b ON a.ID = b.生徒ID
生徒マスタ a LEFT OUTER JOIN 特待生マスタ b ON a.ID = b.生徒ID
生徒マスタ a RIGHT OUTER JOIN 特待生マスタ b ON a.ID = b.生徒ID
1
削除フラグ
0
0
0
0
0
3. Copyright 2016-2018 G1Systems Inc.3
生徒マスタ 特待生マスタ
生徒マスタ a INNER JOIN 特待生マスタ b ON a.ID = b.生徒ID
INNER JOIN
INNER JOIN は、マッチした部分だけが残る。
2 C
生徒ID ランク
3 A
10 B
33 C
40 B
48 C
1石野 扶樹
ID氏名
2岩崎 研二
3岩間 竜也
4上野 浩介
5岡崎 雅之
6岡島 慶二
1
削除フラグ
0
0
0
0
0
4. Copyright 2016-2018 G1Systems Inc.4
生徒マスタ 特待生マスタ
生徒マスタ a LEFT OUTER JOIN 特待生マスタ b ON a.ID = b.生徒ID
LEFT OUTER JOIN
2 C
生徒ID ランク
3 A
10 B
33 C
40 B
48 C
1石野 扶樹
ID氏名
2岩崎 研二
3岩間 竜也
4上野 浩介
5岡崎 雅之
6岡島 慶二
1
削除フラグ
0
0
0
0
0
LEFT OUTER JOIN は、左側テーブルがすべて残る。
5. Copyright 2016-2018 G1Systems Inc.5
生徒マスタ 特待生マスタ
生徒マスタ a RIGHT OUTER JOIN 特待生マスタ b ON a.ID = b.生徒ID
RIGHT OUTER JOIN
2 C
生徒ID ランク
3 A
10 B
33 C
40 B
48 C
1石野 扶樹
ID氏名
2岩崎 研二
3岩間 竜也
4上野 浩介
5岡崎 雅之
6岡島 慶二
1
削除フラグ
0
0
0
0
0
RIGHT OUTER JOIN は、右側テーブルがすべて残る。
6. Copyright 2016-2018 G1Systems Inc.6
例題
すべての生徒のリストに、特待生マスタの削除フラグが 0の
特待生ランクを出力せよ。
2 C
生徒ID ランク
3 A
10 B
33 C
40 B
48 C
1石野 扶樹
ID氏名
2岩崎 研二
3岩間 竜也
4上野 浩介
5岡崎 雅之
6岡島 慶二
生徒マスタ 特待生マスタ
1
削除フラグ
0
0
0
0
0
7. Copyright 2016-2018 G1Systems Inc.
解答
7
SELECT a.氏名, b.ランク
FROM 生徒マスタ a
LEFT OUTER JOIN 特待生マスタ b
ここに結合条件を追加
これを出力
したくない
生徒マスタ 特待生マスタ
2 C
生徒ID ランク
3 A
10 B
33 C
40 B
48 C
1石野 扶樹
ID氏名
2岩崎 研二
3岩間 竜也
4上野 浩介
5岡崎 雅之
6岡島 慶二
1
削除フラグ
0
0
0
0
0
8. Copyright 2016-2018 G1Systems Inc.
これはNG!
8
SELECT
a.氏名, b.ランク
FROM 生徒マスタ a
LEFT OUTER JOIN 特待生マスタ b
ON a.ID = b.生徒ID
WHERE
b.削除フラグ = 0;
10. Copyright 2016-2018 G1Systems Inc.
サブクエリーは意味は正しいけれど……
10
SELECT
a.氏名, b.ランク
FROM 生徒マスタ a
LEFT OUTER JOIN
(SELECT * FROM 特待生マスタ
WHERE 削除フラグ = 0) b
ON a.ID = b.生徒ID;
11. Copyright 2016-2018 G1Systems Inc.
正しくはこうする!
11
SELECT
a.氏名, b.ランク
FROM 生徒マスタ a
LEFT OUTER JOIN 特待生マスタ b
ON a.ID = b.生徒ID
AND 0 = b.削除フラグ;