ホーム > データベーススペシャリスト試験 > 2021年
データベーススペシャリスト試験 2021年 午前2 問08
“社員取得資格”表に対しSQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。

ア:
ON C1. 社員コード = C2. 社員コード
AND C1.資格 = 'FE' AND C2.資格 = 'AP'
WHERE C1.資格 = 'FE'
(正解)イ:
ON C1. 社員コード = C2. 社員コード
AND C1.資格 = 'FE' AND C2.資格 = 'AP'
WHERE C1.資格 IS NOT NULL
ウ:
ON C1.社員コード = C2.社員コード
AND C1. 資格 = 'FE' AND C2. 資格 = 'AP'
WHERE C2. = 'AP'
エ:
ON C1.社員コード = C2.社員コード
WHERE C1.資格 = 'FE' AND C2.資格 = 'AP'
解説
社員取得資格表に対するSQL結合条件の選択【午前2 解説】
要点まとめ
- 結論:正解はアの「ON句に結合条件と資格条件、WHERE句でC1.資格='FE'」を使う構文です。
- 根拠:LEFT OUTER JOINでC1の資格が'FE'の行を基準に、C2の資格が'AP'の行を結合し、資格1と資格2を分けて取得します。
- 差がつくポイント:ON句に結合条件と資格条件を正しく記述し、WHERE句でC1の資格を限定することでNULLも含めた正しい結果が得られます。
正解の理由
アのSQL文は、社員コードが同じでC1の資格が'FE'、C2の資格が'AP'の行をON句で結合し、さらにWHERE句でC1の資格を'FE'に限定しています。これにより、資格1に'FE'、資格2に'AP'が対応した行が抽出され、資格2が存在しない場合はNULLが入るため、問題の結果表と一致します。LEFT OUTER JOINの特性を活かし、C1を基準にC2を結合している点が正しい設計です。
よくある誤解
ON句に資格条件を入れずにWHERE句で両方の資格を指定すると、INNER JOINのように動作しNULL行が除外される誤りが起こりやすいです。
解法ステップ
- 基準となる資格(ここでは'FE')を持つ行をC1として選ぶ。
- 同じ社員コードで資格が'AP'の行をC2として結合する。
- LEFT OUTER JOINを使い、C2に該当資格がない場合はNULLを許容する。
- ON句に結合条件と資格条件を記述し、WHERE句でC1の資格を限定する。
- SELECT句でC1.資格を資格1、C2.資格を資格2として表示する。
選択肢別の誤答解説
- ア: 正解。ON句に結合条件と資格条件を正しく記述し、WHERE句でC1の資格を限定している。
- イ: WHERE句で「C1.資格 IS NOT NULL」としているが、これでは資格がNULLの行も含まれ、結果が異なる。
- ウ: WHERE句で「C2. = 'AP'」と記述が不完全で文法エラー。さらにWHERE句でC2の資格を限定するとLEFT JOINの意味が失われる。
- エ: ON句に資格条件がなく、WHERE句でC2の資格を指定しているため、LEFT JOINがINNER JOINのように動作し、NULL行が除外される。
補足コラム
LEFT OUTER JOINは左側テーブルの全行を保持し、右側テーブルの結合条件に合致しない場合はNULLを補完します。ON句に結合条件と絞り込み条件を記述し、WHERE句で左側テーブルの条件を指定することで、NULLを含む正しい結果を得られます。資格のように複数行あるデータを列に展開する際に有効な手法です。
FAQ
Q: LEFT OUTER JOINでON句とWHERE句の条件はどちらに書くべきですか?
A: 結合条件や右側テーブルの絞り込みはON句に、左側テーブルの条件はWHERE句に書くのが基本です。WHERE句で右側テーブルの条件を指定するとINNER JOINのように動作します。
A: 結合条件や右側テーブルの絞り込みはON句に、左側テーブルの条件はWHERE句に書くのが基本です。WHERE句で右側テーブルの条件を指定するとINNER JOINのように動作します。
Q: 資格がNULLの社員は結果にどう表示されますか?
A: LEFT OUTER JOINでC1の資格が'FE'に限定されているため、資格がNULLの社員はC1に含まれず結果に表示されません。
A: LEFT OUTER JOINでC1の資格が'FE'に限定されているため、資格がNULLの社員はC1に含まれず結果に表示されません。
関連キーワード: SQL JOIN, LEFT OUTER JOIN, 結合条件, 資格管理, データベースクエリ, SQL文法, NULL処理