基本情報技術者 2012年 春期 午前(科目A) 問30
問題文
“注文”表と“製品”表に対して、次のSQL文を実行したときに得られる結果はどれか。
SELECT 製品名, 数量 FROM 注文, 製品
WHERE 注文.製品コード = 製品.製品コード

選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
内積結合による製品別注文一覧【午前解説】
正解の理由
与えられた SQL は暗黙の結合で、条件は注文.製品コード = 製品.製品コード です。これは INNER JOIN と同義で、注文テーブルの各行と製品テーブルの一致する行を結び付けて出力します。SQL に GROUP BY も DISTINCT もないため、同じ製品コードに対して注文が複数ある場合は製品名と数量の組が注文ごとに複数行で出力されます。よって、「PC 100」が注文に2行存在するならば結果にも PC 100 が2行表示される選択肢、すなわち ウ が正解です。
解法ステップ
- SQL の結合文を確認:FROM 注文, 製品 と WHERE の等式は暗黙の INNER JOIN。
- 集約関数や DISTINCT があるか確認:ない → 行はそのまま出る。
- 注文テーブルの行ごとに製品テーブルを結合していくイメージで、同じ製品に複数注文があれば同名行が複数出力される。
- 製品側に対応する行がない注文は除外されるため、製品名が NULL になる行は出ない。
- 以上より選択肢を比較し、重複が残り合算されていないものを選ぶ。
選択肢別の誤答解説
- ア:PC が一度しか表示されておらず(100 のみ)、重複行が消えているため誤り。DISTINCT や集計を想定した結果です。
- イ:PC の数量が 200 になっており、複数注文を合算している想定であり SUM を使った結果なので誤り。
- ウ:注文ごとに製品名が紐付けられ、PC の行が注文分だけ(ここでは2回)表示されている。集約や NULL 行もないため正解、ウ。
- エ:製品名が NULL の行が存在しており、これは LEFT JOIN や製品テーブルに存在しない製品コードがある場合の出力を示唆するが、今回のクエリは内部結合なので NULL 行は出ないため誤り。
よくある誤解
- 「数量が合計される」と考える誤解:GROUP BY や SUM がない限り自動的に合算はされません。
- 「結合 = LEFT JOIN と同じ」と考える誤解:WHERE による条件付き結合は内部結合なので、製品表にマッチしない注文は出力されません(NULL は出ない)。
- 「重複は自動で消える」と思う誤解:SELECT の結果はテーブルの行単位で返るため、重複行はそのまま残ります(DISTINCT が必要)。
補足コラム
暗黙の結合(FROM A, B WHERE A.x = B.x)は古い書き方ですが、動作は INNER JOIN と同じです。可読性や保守性の観点からは ANSI-92 標準の FROM A JOIN B ON ... を使うことが推奨されます。また、結合結果を集計したい場合は GROUP BY と SUM、重複を排除したい場合は DISTINCT を明示してください。さらに、結合キーにインデックスが張られていると結合性能が大きく改善します。
FAQ
Q1: なぜ PC が2行になるのですか?
A1: 注文テーブルに PC の注文が2行あるため、製品名と数量の組が注文ごとに出力されるからです(集約がないため合算されません)。
A1: 注文テーブルに PC の注文が2行あるため、製品名と数量の組が注文ごとに出力されるからです(集約がないため合算されません)。
Q2: 製品名が NULL の行が出ることはありますか?
A2: 指定されたクエリ(内部結合)では出ません。LEFT JOIN を使った場合や製品テーブルに該当行がない場合に NULL になります。
A2: 指定されたクエリ(内部結合)では出ません。LEFT JOIN を使った場合や製品テーブルに該当行がない場合に NULL になります。
Q3: 結果の行順は保証されますか?
A3: ORDER BY 指定がない限り SQL の出力順は保証されません。問題の選択肢は便宜上の表示順を想定しています。
A3: ORDER BY 指定がない限り SQL の出力順は保証されません。問題の選択肢は便宜上の表示順を想定しています。
関連キーワード: SQL、SELECT、WHERE、内部結合、暗黙的結合、カーティシアン積、重複行、NULL処理、GROUP BY、DISTINCT、JOIN、集約、インデックス、パフォーマンス、等値結合

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

