平成21年度 秋期 午前Ⅱ 問23
データベース
SQL文
“納品”表と“顧客”表を自然結合するSQL文はどれか。
納品
| 顧客番号 | 商品番号 | 納品数量 |
|---|
顧客
| 顧客番号 | 顧客名 |
|---|
- アSELECT * FROM 納品,顧客 WHERE 納品.顧客番号 = 顧客.顧客番号
- イSELECT 顧客.顧客番号,納品.商品番号,納品.納品数量,顧客.顧客名 FROM 納品,顧客 WHERE 納品.顧客番号 <> 顧客.顧客番号
- ウSELECT 納品.顧客番号,納品.商品番号,納品.納品数量 FROM 納品 WHERE 納品.顧客番号 IN (SELECT 顧客番号 FROM 顧客)
- エSELECT 納品.顧客番号,納品.商品番号,納品.納品数量,顧客.顧客名 FROM 納品,顧客 WHERE 納品.顧客番号 = 顧客.顧客番号
答えと解説を見る
✓ これが正解エSELECT 納品.顧客番号,納品.商品番号,納品.納品数量,顧客.顧客名 FROM 納品,顧客 WHERE 納品.顧客番号 = 顧客.顧客番号
解説
一致条件で結合し、共通の顧客番号を1列だけ取り出すSQLです。
自然結合は、二つの表に共通する列の値が等しい行どうしを結び付け、その共通の列は結果に1回だけ含める結合です。納品表と顧客表の共通の列は顧客番号なので、条件は 納品.顧客番号 = 顧客.顧客番号 となります。結果の列は、顧客番号、商品番号、納品数量、顧客名の四つで、顧客番号は一方の表からだけ取り出します。正解の SQL 文はこの条件で結合し、顧客番号を納品表の側から1列だけ選び、顧客名を加えています。見分ける軸は、結合条件が等号か、結果に共通の列が重複していないか、両方の表の列が含まれているかの三点です。等結合と自然結合の違いは、共通列が二重に出るかどうかだと覚えておくと迷いません。
ほかの選択肢はなぜ違うのか
- アSELECT * FROM 納品,顧客 …:SELECT * を使っているので、納品表と顧客表の両方の顧客番号が結果に並び、共通の列が2列になります。値が等しい行を結ぶ条件は正しいものの、共通の列を1回だけにする自然結合ではなく、等結合の結果になります。
- イSELECT 顧客.顧客番号,納品.商品…:結合条件が <> になっていて、顧客番号が等しくない行どうしを組み合わせています。これでは、ある納品に関係の無い顧客の名前が並ぶ結果になり、共通列の値が等しい行を結ぶという自然結合の意味から外れます。
- ウSELECT 納品.顧客番号,納品.商品…:副問合せで顧客表に存在する顧客番号の納品だけを選んでいますが、結果の列は納品表の三つだけで、顧客名が含まれていません。二つの表の列を合わせて一つの表にする結合にはなっていません。
出典:平成21年度 秋期 システムアーキテクト試験 午前Ⅱ 問23
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)