令和2年秋期午後問6
広告
みおまるさん
(No.1)
https://www.ap-siken.com/kakomon/02_aki/pm06.html
図.3のSQLについて(C空欄)
EXISTS句とIN句の使い分けが分かっていないので教えてください。
副問い合わせ表を「SELECT * FROM 」ではなく「SELECT 列名 FROM 表名」で指定したとしたら、「NOT IN」を使っても全体のSQL実施結果としては同じ結果を得られるのでしょうか。
IN句ではなく、EXISTS句が正しいという根拠として副問い合わせのSQLが「SELECT * FROM」となっているからなのか分からないため、確認させていただきました。
※自分でSQL実施確認すればよいのですが、PCにPgAdminなど環境構築に時間がかかってしまうので、質問させていただきました。
図.3のSQLについて(C空欄)
EXISTS句とIN句の使い分けが分かっていないので教えてください。
副問い合わせ表を「SELECT * FROM 」ではなく「SELECT 列名 FROM 表名」で指定したとしたら、「NOT IN」を使っても全体のSQL実施結果としては同じ結果を得られるのでしょうか。
IN句ではなく、EXISTS句が正しいという根拠として副問い合わせのSQLが「SELECT * FROM」となっているからなのか分からないため、確認させていただきました。
※自分でSQL実施確認すればよいのですが、PCにPgAdminなど環境構築に時間がかかってしまうので、質問させていただきました。
2025.10.07 14:46
応用太郎さん
(No.2)
> 副問い合わせ表を「SELECT * FROM 」ではなく「SELECT 列名 FROM 表名」で指定したとしたら、「NOT IN」を使っても全体のSQL実施結果としては同じ結果を得られるのでしょうか。
いいえ。
質問者さんの例示内容を具体的に書くと、
... FROM 部屋
WHERE 部屋ID NOT IN (
SELECT 部屋ID FROM 予約明細 ...
になります。WHERE 部屋ID NOT IN (
SELECT 部屋ID FROM 予約明細 ...
ここで指定している予約明細.部屋IDですが、(NOT NULL制約が設けられていなければ) NULLが存在する可能性があります。
NOT INはサブクエリが返したリストにNULLが含まれると(評価がTRUEであるにも関わらず) 最終的に1行も返さなくなります。
問題文中には予約明細.部屋IDに対してFOREIGN KEY以外にNOT NULL制約が存在する旨が書かれていないため、不適格になります。
...正直、試験でこんな知識を求められることはないと思いますのでこの話は忘れてください。
> IN句ではなく、EXISTS句が正しいという根拠として副問い合わせのSQLが「SELECT * FROM」となっているからなのか
これは正解です。
サブクエリでSELECT *としている以上、IN句を使用するには同数のタプルを指定する必要があります。
(expressionと記している部分はダミーです。)
例)
... FROM 部屋
WHERE (expression, expression , 部屋ID, expression , expression ) NOT IN (
SELECT * FROM 予約明細 ...
しかしながら部屋表にはexpressionに当てはまる適当な属性が存在しません。なので、NOT INは誤りです。WHERE (expression, expression , 部屋ID, expression , expression ) NOT IN (
SELECT * FROM 予約明細 ...
※ 実際にはexpressionと表した部分は属性名以外も指定できるのですが、説明は省きます。
2025.10.07 16:22
みおまるさん
(No.3)
>応用太郎さん
ご回答ありがとうございます。
>ここで指定している予約明細.部屋IDですが、(NOT NULL制約が設けられていなければ) NULLが存在する可能性があります。
→外部キー(部屋ID)の場合、NULLも重複も許容するのでNOT NULL制約がなければNULLが含まれている可能性があるということですね。
IN句の場合、副問い合わせでデータが存在(EXISTS句でTRUE)してもNULLだと返されないため、EXISTS句と結果が相違するということで理解できました。
>サブクエリでSELECT *としている以上、IN句を使用するには同数のタプルを指定する必要があります。
→ありがとうございます。IN句とEXISTS句の使い分けについておかげ様で理解を深めることができました。expressionは余程のことがない限り応用情報の問題には出てこないですよね
2025.10.07 16:43
応用太郎さん
(No.4)
> expressionは余程のことがない限り応用情報の問題には出てこないですよね
そうですね。
過去問で見た記憶ないですし、出ないとは思います。
(JIS X 3005規格に載っている以上断言はできませんが)
変化球を出してくるときは大抵WITH RECURSIVE(R06秋)やWINDOW(R05秋)などの関数やオプション系です。
2025.10.07 17:32
応用太郎さん
(No.5)
あ、、、一つだけ訂正です。
JIS X 3005規格ではタプル指定時には括弧の前にROWが必要でした。大変失礼しました。
JIS X 3005規格ではタプル指定時には括弧の前にROWが必要でした。大変失礼しました。
... FROM 部屋
WHERE ROW(expression, expression , 部屋ID, expression , expression ) NOT IN (
SELECT * FROM 予約明細 ...
出ないとは思いますが、念のため。WHERE ROW(expression, expression , 部屋ID, expression , expression ) NOT IN (
SELECT * FROM 予約明細 ...
2025.10.07 17:47
みおまるさん
(No.6)
>応用太郎さん
ありがとうございます。
確かに出てこないとは断言できませんよね。。
詳しく教えてくださりありがとうございます。タプル指定時は「ROW」を入れるのですね。。。
>変化球を出してくるときは大抵WITH RECURSIVE(R06秋)やWINDOW(R05秋)などの関数やオプション系です。
WITH句(令和6年秋)やWINDOW関数(R5年秋)、CREATE文(令和4年秋)が出てきた年は難易度高めで講評されていますね。。
今回変化球出してくるとしたら、REVOKE文とか出てきそうって勝手に予想しています(笑)
2025.10.07 18:24
広告
返信投稿用フォーム
投稿記事削除用フォーム
広告