rink_rewさんの投稿一覧
EMPLOYEES表のレコードはEMPLOYEES_IDをキーに、その従業員の名前や上司の情報が格納されているものだと思いますが、MANAGER_ID列自体は「その従業員の上司のEMPLOYEE_ID」を表していて、その従業員に上司がいなければ空です。
本設問の問題文では、
EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員の名前と、上司のEMPLOYEE_IDを出力します。
となっていますが、ここで「上司のEMPLOYEE_ID」の代わりに「上司のMANAGER_ID」と言ってしまうと、「上司の上司のEMPLOYEE_ID」を出力したいということになります。
解説にある正解の実行結果を見ると、列名は MANAGER_ID になりますが、実際に表示されているのは「上司のEMPLOYEE_ID」です。
実務でこういう出力を求めるシチュエーションなら、列別名とかつけると見やすいかなとは思いますけど、ちょっと趣旨から外れますね。
「オブジェクトを格納」はその通りだと思うのですが、「領域」かと問われると、解説にも記載の通りスキーマは「論理的な概念」と捉える方が適切だと思うので、ちょっと違うかなと感じます。
データベースの記憶域として考えれば、表や索引などのオブジェクトが実際に格納されるのはデータファイルということになりますし、スキーマはどちらかといえば、オブジェクトの管理単位のようなものだと理解しています。
とはいえ、黒本などでも「スキーマに格納される」といった表現もありますので、設問の選択肢としてはもう少し具体的な表現となっていた方がスッキリする気がしますね。
この設問だと、確かにおっしゃる通りemployees表のdepartment_idはNULLになり得るので、選択肢のSQLだと「全従業員の」表示にならない可能性ありますね。外部結合が適切ですね。
画像のオプションですが、-l(小文字のエル)ではなく、-I(大文字のアイ)になってるみたいですね...。
dropdbの-iに関しては環境によっては大文字でも小文字でも同じ結果が返るみたいですので間違いではないと言えるかもしれませんが、画像の前の説明部分で小文字ですし、小文字で統一されてた方が望ましいですね。
③の副問合せのSELECT文はUSING句を使用した結合を行ってます。USINGはそもそも2つの表に共通する列(同じ名前の列)を結合条件として使用するので、接頭辞をつける必要はありません。副問合せの出力結果は以下のとおりとなり、問題なくINSERTに使用できます。
SQL> SELECT department_id, department_name, avg_sal FROM v_emp JOIN departments USING (department_id);
DEPARTMENT_ID DEPARTMENT_NAME AVG_SAL
------------- ------------------------------ ----------
1 総務 431250
2 営業 400000
3 開発 400000
4 マーケティング 366666.667
5 品質管理 450000