助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26594
問題を開く
PROD表とOLDPROD表の構造とデータを確認して下さい。




次の問合せの実行結果として、正しいものはどれですか。
SELECT prodid, name, category
FROM prod
WHERE category IN
(SELECT category FROM oldprod);




次の問合せの実行結果として、正しいものはどれですか。
SELECT prodid, name, category
FROM prod
WHERE category IN
(SELECT category FROM oldprod);
正解
正常に実行され、PROD表のCATEGORY列の値が"10"と"40"の行が表示される
解説
IN演算子はリスト内のいずれかの値と等しい場合にTRUEを返すため、IN演算子の値のリストにNULL値以外の値が含まれていて、その値と比較対象の値が等しければ、主問合せでデータが取り出されます。
設問のSQL文の副問合せでは"10","40","NULL"が返されますが、PROD表のCATEGORY列が"10","40"である行があるため、データが取り出されます。
なお、PROD表のCATEGORY列が"NULL"である行もありますが、NULL値同士を判定してもNULL値となり、値が等しいという判定ができないので、CATEGORY列が"NULL"である行は取り出されません。
以上より、
・正常に実行され、PROD表のCATEGORY列の値が"10"と"40"の行が表示される
が正解となります。
設問のSQL文の実行結果は次のようになります。

参考:
WHERE句に指定された副問合せがNULL値を戻した場合、主問合せの結果は0件になります。
ただし、IN演算子の場合は、リスト内のいずれかの値と等しい場合にTRUEを返すため、IN演算子の値のリストにNULL値が含まれていても、NULL値以外の値と比較対象の値が等しければ、主問合せでデータが取り出されます。

NOT IN演算子の場合は、リスト内の全ての値と等しくない場合にTRUEを返しますが、NOT IN演算子の値のリストにNULL値が含まれていると、NULL値と比較対象の値の比較結果がNULL値になるので、全ての値と等しくないという判定がなされません。そのため、主問合せではデータが1件も取り出されません。

上記の例で、OLDPROD表に含まれないCATEGORY列の値をPROD表から取り出したいのであれば、以下のようにNULLを除外して実行する必要がありますので、注意しましょう。

設問のSQL文の副問合せでは"10","40","NULL"が返されますが、PROD表のCATEGORY列が"10","40"である行があるため、データが取り出されます。
なお、PROD表のCATEGORY列が"NULL"である行もありますが、NULL値同士を判定してもNULL値となり、値が等しいという判定ができないので、CATEGORY列が"NULL"である行は取り出されません。
以上より、
・正常に実行され、PROD表のCATEGORY列の値が"10"と"40"の行が表示される
が正解となります。
設問のSQL文の実行結果は次のようになります。

SQLを表示
SELECT prodid, name, category
FROM prod
WHERE category IN
(SELECT category FROM oldprod);
FROM prod
WHERE category IN
(SELECT category FROM oldprod);
参考:
WHERE句に指定された副問合せがNULL値を戻した場合、主問合せの結果は0件になります。
ただし、IN演算子の場合は、リスト内のいずれかの値と等しい場合にTRUEを返すため、IN演算子の値のリストにNULL値が含まれていても、NULL値以外の値と比較対象の値が等しければ、主問合せでデータが取り出されます。

SQLを表示
SELECT category FROM oldprod;
SELECT prodid, name, category
FROM prod
WHERE category IN
(SELECT category FROM oldprod);
SELECT prodid, name, category
FROM prod
WHERE category IN
(SELECT category FROM oldprod);
NOT IN演算子の場合は、リスト内の全ての値と等しくない場合にTRUEを返しますが、NOT IN演算子の値のリストにNULL値が含まれていると、NULL値と比較対象の値の比較結果がNULL値になるので、全ての値と等しくないという判定がなされません。そのため、主問合せではデータが1件も取り出されません。

SQLを表示
SELECT category FROM oldprod;
SELECT prodid, name, category
FROM prod
WHERE category NOT IN
(SELECT category FROM oldprod);
SELECT prodid, name, category
FROM prod
WHERE category NOT IN
(SELECT category FROM oldprod);
上記の例で、OLDPROD表に含まれないCATEGORY列の値をPROD表から取り出したいのであれば、以下のようにNULLを除外して実行する必要がありますので、注意しましょう。

SQLを表示
SELECT prodid, name, category
FROM prod
WHERE category NOT IN
(SELECT category FROM oldprod
WHERE category IS NOT NULL);
FROM prod
WHERE category NOT IN
(SELECT category FROM oldprod
WHERE category IS NOT NULL);
解説について
投稿日 2026/05/27
解説
設問のSQL文の副問合せでは"10","40","NULL"が返されますが
"60"も含まれると思いますがどうでしょうか
この投稿に対して返信しませんか?