ホーム > データベーススペシャリスト試験 > 2018年
データベーススペシャリスト試験 2018年 午前2 問08
“部品”表から、部品名に‘N11’が含まれる部品情報(部品番号、部品名)を検索するSQL文がある。このSQL文は、検索対象の部品情報のほか、対象部品に親部品番号が設定されている場合は親部品情報を返し、設定されていない場合はNULLを返す。(a)に入れる字句はどれか。ここで、実線の下線は主キーを表す。
部品(部品番号、部品名、親部品番号)
〔SQL文〕
SELECTB1.部品番号, B1.部品名,
B2.部品番号 AS 親部品番号, B2.部品名 AS 親部品名
FROM 部品 (a)
ON B1.親部品番号 = B2.部品番号
WHERE B1.部品名 LIKE '%N11%'
ア:B1 JOIN 部品 B2
イ:B1 LEFT OUTER JOIN 部品 B2(正解)
ウ:B1 RIGHT OUTER JOIN 部品 B2
エ:B2 LEFT OUTER JOIN 部品 B1
解説
部品表から親部品情報を含めて検索するSQL文のJOIN句選択【午前2 解説】
要点まとめ
- 結論:親部品番号が設定されていない場合も対象部品情報を必ず取得するため、B1を基準にしたLEFT OUTER JOINが必要です。
- 根拠:LEFT OUTER JOINは左側テーブルの全行を取得し、右側テーブルに該当がなければNULLを返すため、親部品がない場合もNULLで補完されます。
- 差がつくポイント:単なるJOIN(INNER JOIN)では親部品がない行が除外されるため、問題文の要件を満たせません。
正解の理由
正解はイ: B1 LEFT OUTER JOIN 部品 B2です。
このSQLは、部品表をB1として部品名に‘N11’を含む部品を抽出し、B1の親部品番号をキーにB2(同じ部品表の別エイリアス)と結合します。LEFT OUTER JOINを使うことで、B1の全行(対象部品)が必ず取得され、親部品番号がNULLや該当なしの場合はB2の列がNULLとなり、問題文の「親部品番号が設定されていない場合はNULLを返す」条件を満たします。
このSQLは、部品表をB1として部品名に‘N11’を含む部品を抽出し、B1の親部品番号をキーにB2(同じ部品表の別エイリアス)と結合します。LEFT OUTER JOINを使うことで、B1の全行(対象部品)が必ず取得され、親部品番号がNULLや該当なしの場合はB2の列がNULLとなり、問題文の「親部品番号が設定されていない場合はNULLを返す」条件を満たします。
よくある誤解
INNER JOINを使うと親部品がない部品は結果から除外されるため、必ずしも全対象部品が取得できるわけではありません。
RIGHT OUTER JOINや逆の結合順序は、基準テーブルが変わり意図した結果にならないことがあります。
RIGHT OUTER JOINや逆の結合順序は、基準テーブルが変わり意図した結果にならないことがあります。
解法ステップ
- 問題文の要件を確認し、「親部品番号が設定されていない場合はNULLを返す」ことを理解する。
- 親部品情報を同じ表から取得するため、自己結合(自己JOIN)を使うことを認識する。
- 対象部品(B1)を基準に全行取得し、親部品(B2)を結合するためLEFT OUTER JOINを選択する。
- ON句でB1の親部品番号とB2の部品番号を結合条件に設定する。
- WHERE句でB1の部品名に‘N11’を含む条件を指定する。
選択肢別の誤答解説
- ア: B1 JOIN 部品 B2
→ INNER JOINであり、親部品番号がNULLの行は除外されるため要件を満たさない。 - イ: B1 LEFT OUTER JOIN 部品 B2
→ 正解。B1の全行を取得し、親部品がなければNULLを返す。 - ウ: B1 RIGHT OUTER JOIN 部品 B2
→ RIGHT OUTER JOINは右側テーブル(B2)を基準に全行取得するため、対象部品が欠落する可能性がある。 - エ: B2 LEFT OUTER JOIN 部品 B1
→ 結合順序が逆で、親部品を基準にしているため、対象部品が全て取得できない。
補足コラム
自己結合は同じテーブルを複数回参照する際に使われ、親子関係や階層構造のデータを扱う際に有効です。
LEFT OUTER JOINは左側テーブルの全行を保持し、右側テーブルに該当がなければNULLを補完するため、欠損データの扱いに便利です。
LEFT OUTER JOINは左側テーブルの全行を保持し、右側テーブルに該当がなければNULLを補完するため、欠損データの扱いに便利です。
FAQ
Q: INNER JOINとLEFT OUTER JOINの違いは何ですか?
A: INNER JOINは両テーブルにマッチする行のみ取得し、LEFT OUTER JOINは左テーブルの全行を取得し右テーブルに該当がなければNULLを返します。
A: INNER JOINは両テーブルにマッチする行のみ取得し、LEFT OUTER JOINは左テーブルの全行を取得し右テーブルに該当がなければNULLを返します。
Q: なぜRIGHT OUTER JOINは使わないのですか?
A: RIGHT OUTER JOINは右テーブルを基準に全行取得するため、今回のように対象部品(左テーブル)を全て取得したい場合に適しません。
A: RIGHT OUTER JOINは右テーブルを基準に全行取得するため、今回のように対象部品(左テーブル)を全て取得したい場合に適しません。
Q: 自己結合の際にエイリアスは必須ですか?
A: はい。同じテーブルを複数回参照するため、区別するためにエイリアスを付ける必要があります。
A: はい。同じテーブルを複数回参照するため、区別するためにエイリアスを付ける必要があります。
関連キーワード: SQL, JOIN句, LEFT OUTER JOIN, 自己結合, 部品表, NULL補完, 階層構造, 部品番号検索