ホーム > システムアーキテクト試験 > 2009年
システムアーキテクト試験 2009年 午前2 問23
“納品”表と“顧客”表を自然結合するSQL文はどれか。


ア:SELECT *
FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号
ウ:納品.顧客番号, 納品.商品番号, 納品.納品数量
FROM 納品
WHERE 納品.顧客番号 IN (SELECT 顧客番号 FROM 顧客)
エ:SELECT 納品.顧客番号, 納品.商品番号, 納品.納品数量, 顧客.顧客名
FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号(正解)
イ:SELECT 顧客.顧客番号, 納品.商品番号, 納品.納品数量, 顧客.顧客名
FROM 納品, 顧客
WHERE 納品.顧客番号 <> 顧客.顧客番号
解説
“納品”表と“顧客”表を自然結合するSQL文はどれか【午前2 解説】
要点まとめ
- 結論:自然結合は共通の列をキーに等価条件で結合し、必要な列を明示的に指定するSQL文が正解です。
- 根拠:「納品」表と「顧客」表は「顧客番号」で結合し、両表の必要な列をSELECT句で指定するのが自然結合の基本です。
- 差がつくポイント:単に全列を取得する「SELECT *」ではなく、結合キーと必要な列を明示し、結合条件が「=」であることを正確に理解することが重要です。
正解の理由
選択肢エは「納品」と「顧客」テーブルをFROM句で並べ、WHERE句で「納品.顧客番号 = 顧客.顧客番号」と等価結合条件を指定しています。さらにSELECT句で両テーブルの必要な列(顧客番号、商品番号、納品数量、顧客名)を明示的に指定しており、自然結合の要件を満たしています。これにより、両テーブルの共通キー「顧客番号」で正しく結合し、関連情報を取得できます。
よくある誤解
「SELECT *」で全列を取得すれば自然結合になると誤解しがちですが、必要な列を明示しないと結果の理解やパフォーマンスに影響します。また、結合条件が「<>」(不等号)では結合にならず、意図しない結果になります。
解法ステップ
- 両テーブルの共通の結合キー(ここでは「顧客番号」)を確認する。
- 自然結合はこの共通キーで等価結合(=)を行うことを理解する。
- SELECT句で必要な列を明示的に指定し、全列取得は避ける。
- FROM句に両テーブルをカンマ区切りで記述し、WHERE句で結合条件を指定する。
- 条件が「=」であることを確認し、不等号やIN句は自然結合の定義に合わないことを認識する。
選択肢別の誤答解説
- ア:SELECT *で全列を取得しているが、必要な列を明示していないため自然結合としては不十分。
- イ:WHERE句で「<>」不等号を使っており、結合条件として誤り。結果は結合ではなく非結合の組み合わせになる。
- ウ:IN句を使いサブクエリで絞り込んでいるが、自然結合の定義とは異なり、結合結果としての結合列の結合が明示されていない。
- エ:正解。必要な列を明示し、等価結合条件で自然結合を正しく表現している。
補足コラム
自然結合(NATURAL JOIN)はSQL標準で用意されている結合方法の一つで、共通の列名を自動的にキーとして結合します。ただし、実務では明示的に結合条件を指定することが多く、今回のようにWHERE句で「=」を使った結合が一般的です。明示的な結合条件は可読性と保守性を高めます。
FAQ
Q: 自然結合と内部結合は同じですか?
A: 自然結合は共通列を自動的にキーにする内部結合の一種ですが、内部結合は結合条件を明示的に指定することが多いです。
A: 自然結合は共通列を自動的にキーにする内部結合の一種ですが、内部結合は結合条件を明示的に指定することが多いです。
Q: SELECT *を使うと何が問題ですか?
A: 不要な列まで取得してしまい、パフォーマンス低下や結果の理解が難しくなるため、必要な列を明示することが推奨されます。
A: 不要な列まで取得してしまい、パフォーマンス低下や結果の理解が難しくなるため、必要な列を明示することが推奨されます。
関連キーワード: SQL, 自然結合, 内部結合, 等価結合, SELECT句, WHERE句, テーブル結合, サブクエリ, IN演算子