Re: 問題ID: 20001 について
yokoyama68
投稿数: 28
長文解説失礼いたします
1)はWHEREに(NOT) EXISTSを使った相関副問い合わせと呼ばれる
SQLなかでもかなり特殊な動作をするものです
通常のSQLは結果を返すのが目的ですが、相関副問い合わせは
存在を確認するのが目的になります
用語を簡単に置き換えてみます
部下のいない従業員 = 平社員
上司のいない従業員 = 社長
「上司がいない従業員も存在します」という説明はこの問題の罠で
2)の"NOT IN"の時にNULLが含まれる可能性を意味しています
置き換えた例だと"社長"に上司はいないということです
"NOT IN"の時にNULLが含まれると結果が0になることに対しての注意書きです
このSQLですが、WHERE内部の(NOT) EXISTSは結果を返さず
存在判定のみ行います
それが(NOT) INとは大きく異なります
直観的にはプログラミング言語のIF文と考えてもよいでしょう
SELECT m.employee_name FROM employees m
WHERE NOT EXISTS (
SELECT e.employee_id
FROM employees e
WHERE e.manager_id = m.employee_id);
またSQLの実行順番も通常のSQLと異なります
このSQLでは外側のSELECTを実行し、その結果の1行毎に内側の
WHEREを実行します
条件はNOT "WHERE e.manager_id = m.employee_id"なので
自分がだれかの上司となっている行があるか?を確認し、
その後、NOTなので結果をひっくり返したものが結果になります
つまり平社員かを確認していることになります
最終的に条件が満たされた行が外側のSELECTで表示されます
またWHERE内のSELECTに書かれている"e.employee_id"はダミーです
ここに書いたものが外側のSELECTに返るわけではないです
なのでここは"e.employee_id"ではなく、1と書いても問題ないです
1)はWHEREに(NOT) EXISTSを使った相関副問い合わせと呼ばれる
SQLなかでもかなり特殊な動作をするものです
通常のSQLは結果を返すのが目的ですが、相関副問い合わせは
存在を確認するのが目的になります
用語を簡単に置き換えてみます
部下のいない従業員 = 平社員
上司のいない従業員 = 社長
「上司がいない従業員も存在します」という説明はこの問題の罠で
2)の"NOT IN"の時にNULLが含まれる可能性を意味しています
置き換えた例だと"社長"に上司はいないということです
"NOT IN"の時にNULLが含まれると結果が0になることに対しての注意書きです
このSQLですが、WHERE内部の(NOT) EXISTSは結果を返さず
存在判定のみ行います
それが(NOT) INとは大きく異なります
直観的にはプログラミング言語のIF文と考えてもよいでしょう
SELECT m.employee_name FROM employees m
WHERE NOT EXISTS (
SELECT e.employee_id
FROM employees e
WHERE e.manager_id = m.employee_id);
またSQLの実行順番も通常のSQLと異なります
このSQLでは外側のSELECTを実行し、その結果の1行毎に内側の
WHEREを実行します
条件はNOT "WHERE e.manager_id = m.employee_id"なので
自分がだれかの上司となっている行があるか?を確認し、
その後、NOTなので結果をひっくり返したものが結果になります
つまり平社員かを確認していることになります
最終的に条件が満たされた行が外側のSELECTで表示されます
またWHERE内のSELECTに書かれている"e.employee_id"はダミーです
ここに書いたものが外側のSELECTに返るわけではないです
なのでここは"e.employee_id"ではなく、1と書いても問題ないです
投稿ツリー
-
問題ID: 20001 について
(yamadanbira, 2021-6-17 16:42)
-
Re: 問題ID: 20001 について
(yokoyama68, 2021-6-17 17:44)
- Re: 問題ID: 20001 について (yamadanbira, 2021-6-18 9:40)
-
Re: 問題ID: 20001 について
(yokoyama68, 2021-6-17 17:44)