助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26504
問題を開く
DEPARTMENTS表、EMPLOYEES表の構造を確認して下さい。





全従業員のうち、いずれかの部署に所属している従業員の従業員番号、従業員名、所属部署番号、所属部署名を表示するには、どの問い合わせを実行しますか(該当するものを全て選択して下さい)。

正解

SELECT e.employee_id, e.employee_name, d.department_id, d.department_name FROM departments d, employees e WHERE d.department_id = e.department_id;

SELECT employee_id, employee_name, department_id, department_name FROM departments JOIN employees USING (department_id);

解説

DEPARTMENTS表とEMPLOYEES表から、全従業員のうち、いずれかの部署に所属している従業員の従業員番号、従業員名、所属部署番号、所属部署名を取り出すには、2つの表の共通列であるDEPARTMENT_ID列の値で等価結合を行います。

以上より、
・SELECT e.employee_id, e.employee_name, d.department_id, d.department_name FROM departments d, employees e WHERE d.department_id = e.department_id;
・SELECT employee_id, employee_name, department_id, department_name FROM departments JOIN employees USING (department_id);
が正解となります。

正解のSQL文の実行結果は次のようになります。


 
SQLを表示
SELECT e.employee_id, e.employee_name, d.department_id, d.department_name
FROM departments d, employees e
WHERE d.department_id = e.department_id;



 
SQLを表示
SELECT employee_id, employee_name, department_id, department_name
FROM departments JOIN employees
 USING (department_id);


その他の選択肢については次のとおりです。

・SELECT employee_id, employee_name, department_id, department_name FROM departments NATURAL JOIN employees USING(department_id);
NATURAL JOIN句とUSING句を1つの結合で同時に指定することはできません。

・SELECT employee_id, employee_name, department_id, department_name FROM departments d JOIN employees e ON d.department_id = e.department_id;
2つの表にある同名のDEPARTMET_ID列に表接頭辞が使用されていないためエラーとなります。

・SELECT e.employee_id, e.employee_name, d.department_id, d.department_name FROM departments d NATURAL JOIN employees e ON d.department_id = e.department_id;
NATURAL JOIN句では2つの表にある同名の列が自動的に結合列として判断されるので、ON句を指定することはできません。

参考

等価結合では、結合する2つの表の特定列の値が等しい行だけを結合してデータを取り出します。
等価結合を行うには次の方法があります。

・自然結合(NATURAL JOIN)
・USING句を使用した結合
・ON句を使用した結合
・Oracle独自の結合構文による結合
上に戻る

外部結合では?

投稿日 2025/06/23

問題には「全従業員の」と書かれていますが、選択肢はどれもdepartment_idが入っている従業員しか抽出できない文になっていて、なぜ2つ目と5つ目が正解になるのかがわかりません。
外部結合ではないのでしょうか?


A Ayame_0515

2025/06/24 09:41

追加 2と5がエラーなく実行できることは理解できています!

2025/06/24 16:41

解釈がちがったらすみません。まず単純に2と5以外は構文エラーとなってます。NATURAL JOIN にUSINGもONも使いません。もうひとつの不正解のJOIN ON にはSERECT句に表接頭辞がないのでどちらの表か識別できずエラーになります。不正解はすべて構文エラーとなります。

また外部結合をすると、NULLの場所も表示してしまいます。ただ全従業員の従業員番号、従業員名、所属部署番号、所属部署名を表示するだけならば外部結合はしなくていいと思われます。聞き方に詳しい条件がないので、難しいですが問題形式となると設問に対しても最も適してる回答を選ぶしかないので2と5が妥当になるかなと思います。

例えば全従業員の番号などを表示する際に、売り上げがない人も表示となると外部結合のある問題がでるかもです。

僕も同じく勉強している身なのであくまで個人の見解と知識なので、もっとわかりやすい説明をされている方がいればそちらを参考にしたほうが良いかもです。


コメント

A Ayame_0515

2025/06/24 17:14

ご回答ありがとうございます! 「全従業員の」と書かれていますが、この選択肢の文ではdepartment_idが登録されていない従業員は表示されないのではないか?という点が引っかかっています。 とは言っても他の選択肢がNGなのでこれしか選べないのですが… 教えていただいたことを参考にもう少し考えてみます!

i inatu1227

2025/06/24 17:28

ちなみにdepartment_idはNOT NULLなので値は必ずはいってると思うのでその可能性はこの表定義においては薄そうです!

A Ayame_0515

2025/06/25 09:15

EMPLOYEES表のdepartment_idはNOT NULLじゃないのでNULLの可能性もあるのかな、と思ったのですがどうなんでしょうか…

b blackcat1130

2025/06/25 14:03

>Ayame_0515 ご指摘の通りだと思います。 本問題においては「department_id」は「NOT NULL」制約があるべきであり、nullが含まれていた場合は「全従業員」のデータが抽出されません。 その他の条件から正解を出すことは可能であるため、問題としては成立していますが、不親切な問題であると言わざるをえません。

A Ayame_0515

2025/06/27 15:38

ご回答ありがとうございます! 修正されたみたいです。

この返信に対して
コメントを記入できます

スタッフからの返信

s staff_ishii

2025/06/25 22:28

Ayame_0515 さん、inatu1227 さん、blackcat1130 さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

この投稿に対して返信しませんか?