HOME»応用情報技術者試験掲示板»平成28年秋期 午前問29について
投稿する
いいえ、違います。(そもそも上記の「それ」が何を指すのか曖昧です)
exist は「存在する」という意味の英単語ですから、
EXISTS (SQL文) は、そのSQL文の実行結果が存在するなら真[True]を返し、
NOT EXISTS (SQL文) は、そのSQL文の実行結果が存在しないなら真[True]を返します。
質問者の挙げた次の問題を例に説明します。
応用情報 令和5年 秋期 午前 問29
https://www.ap-siken.com/kakomon/05_aki/q29.html
製品番号 CC5001 の場合、これは製品表と在庫表にともに存在し、在庫数は30を越えますから、
内側のSQLを実行した時点で次のようになり、
SELECT DISTINCT 製品番号 FROM 製品 WHERE NOT EXISTS ('CC5001');
内側のSQLの実行結果が存在しますから次のようになります。
SELECT DISTINCT 製品番号 FROM 製品 WHERE 偽[False];
よって、外側のSELECT句の出力結果はありません。
製品番号 MZ1000 の場合、これは在庫表に存在しませんから、
内側のSQLを実行した時点で次のようになり、
SELECT DISTINCT 製品番号 FROM 製品 WHERE NOT EXISTS (空);
内側のSQLの実行結果が存在しませんから次のようになります。
SELECT DISTINCT 製品番号 FROM 製品 WHERE 真[True];
よって、外側のSELECT句の結果が出力されます。
冒頭で(そもそも上記の「それ」が何を指すのか曖昧です)と書きました。
という「それ」が外側のSELECT句の実行結果を指しているのなら正しいです。
内側のSQLの実行結果を指しているのなら間違っています。
内側のSQLの実行結果は存在する/しないの判定に使われていますから。
平成28年秋期 午前問29について [6039]
らんさん(No.1)
表題で選択肢となっているSQL「EXISTS」と「NOT EXISTS」について教えてください。
https://www.ap-siken.com/kakomon/28_aki/q29.html
他のサイトを確認すると「EXISTS」では、副問合せのSQLに該当する行があればそれを出力する、「NOT EXISTS」では、副問合せのSQLに該当しない行があればそれを出力する動作に見えました。
1行でも該当するものがあれば、テーブルの内容を全て出力するといった旨の内容ではなく、副問合せの条件に合致する行(または合致しない行)のみ出力されていそうでした。
(例えばですが、令和5年 秋期 問29の問題は「NOT EXIST」によって対象レコードを抽出している例が解説に記載されています。
https://www.ap-siken.com/kakomon/05_aki/q29.html)
この理解のうえで本問の解説を読んだのですが、ウの「中間表に対する相関副問合せの結果は常に1行になります」「1行以上あるときに真を返すため、中間表の全レコードが選択されます」やエの「副問合せの行は常に2行になります」「副問合せの結果が存在しないときに真を返すため選択されるレコードはありません」がよく分かりませんでした。
ウもエも、想定通りの対戦表を出力できるSQLに見えます。
「EXISTS」と「NOT EXISTS」はどのような動作をするものなのでしょうか。
https://www.ap-siken.com/kakomon/28_aki/q29.html
他のサイトを確認すると「EXISTS」では、副問合せのSQLに該当する行があればそれを出力する、「NOT EXISTS」では、副問合せのSQLに該当しない行があればそれを出力する動作に見えました。
1行でも該当するものがあれば、テーブルの内容を全て出力するといった旨の内容ではなく、副問合せの条件に合致する行(または合致しない行)のみ出力されていそうでした。
(例えばですが、令和5年 秋期 問29の問題は「NOT EXIST」によって対象レコードを抽出している例が解説に記載されています。
https://www.ap-siken.com/kakomon/05_aki/q29.html)
この理解のうえで本問の解説を読んだのですが、ウの「中間表に対する相関副問合せの結果は常に1行になります」「1行以上あるときに真を返すため、中間表の全レコードが選択されます」やエの「副問合せの行は常に2行になります」「副問合せの結果が存在しないときに真を返すため選択されるレコードはありません」がよく分かりませんでした。
ウもエも、想定通りの対戦表を出力できるSQLに見えます。
「EXISTS」と「NOT EXISTS」はどのような動作をするものなのでしょうか。
2025.10.03 14:37
jjon-comさん(No.2)
★AP プラチナマイスター
> 他のサイトを確認すると
> 「EXISTS」では、副問合せのSQLに該当する行があればそれを出力する、
> 「NOT EXISTS」では、副問合せのSQLに該当しない行があればそれを出力する
> 動作に見えました。
いいえ、違います。(そもそも上記の「それ」が何を指すのか曖昧です)
exist は「存在する」という意味の英単語ですから、
EXISTS (SQL文) は、そのSQL文の実行結果が存在するなら真[True]を返し、
NOT EXISTS (SQL文) は、そのSQL文の実行結果が存在しないなら真[True]を返します。
質問者の挙げた次の問題を例に説明します。
応用情報 令和5年 秋期 午前 問29
https://www.ap-siken.com/kakomon/05_aki/q29.html
製品番号 CC5001 の場合、これは製品表と在庫表にともに存在し、在庫数は30を越えますから、
内側のSQLを実行した時点で次のようになり、
SELECT DISTINCT 製品番号 FROM 製品 WHERE NOT EXISTS ('CC5001');
内側のSQLの実行結果が存在しますから次のようになります。
SELECT DISTINCT 製品番号 FROM 製品 WHERE 偽[False];
よって、外側のSELECT句の出力結果はありません。
製品番号 MZ1000 の場合、これは在庫表に存在しませんから、
内側のSQLを実行した時点で次のようになり、
SELECT DISTINCT 製品番号 FROM 製品 WHERE NOT EXISTS (空);
内側のSQLの実行結果が存在しませんから次のようになります。
SELECT DISTINCT 製品番号 FROM 製品 WHERE 真[True];
よって、外側のSELECT句の結果が出力されます。
冒頭で(そもそも上記の「それ」が何を指すのか曖昧です)と書きました。
> それを出力する
という「それ」が外側のSELECT句の実行結果を指しているのなら正しいです。
内側のSQLの実行結果を指しているのなら間違っています。
内側のSQLの実行結果は存在する/しないの判定に使われていますから。
2025.10.03 15:21
jjon-comさん(No.3)
★AP プラチナマイスター
で、次の問題なのですが。
応用情報 平成28年 秋期 午後 問29
https://www.ap-siken.com/kakomon/28_aki/q29.html
EXISTS、NOT EXISTS に関係なく、不正解です。
外側のSQLのFROM句はこうであり、
FROM チーム AS A, チーム AS B, 審判 AS C
ウとエの内側のSQLのFROM句はこうです。
FROM 審判 AS D
AやBと結合をしているのはDだけで、Cは結合対象になっていません。
応用情報 平成28年 秋期 午後 問29
https://www.ap-siken.com/kakomon/28_aki/q29.html
EXISTS、NOT EXISTS に関係なく、不正解です。
外側のSQLのFROM句はこうであり、
FROM チーム AS A, チーム AS B, 審判 AS C
ウとエの内側のSQLのFROM句はこうです。
FROM 審判 AS D
AやBと結合をしているのはDだけで、Cは結合対象になっていません。
2025.10.03 15:46
jjon-comさん(No.4)
★AP プラチナマイスター
表Cが登場せず、A・B・Dの3表だったとしたら ウ や エ はどうなる? については、次を参照のこと。
https://www.ap-siken.com/bbs/4266.html
https://www.ap-siken.com/bbs/4266.html
2025.10.03 15:52
らんさん(No.5)
とても分かりやすかったです。
丁寧に教えていただきありがとうございます!
丁寧に教えていただきありがとうございます!
2025.10.04 03:55