助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26594
問題を開く
PROD表と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文の実行結果は次のようになります。


 
SQLを表示
SELECT prodid, name, category
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);


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);


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


 
SQLを表示
SELECT prodid, name, category
FROM prod
WHERE category NOT IN
 (SELECT category FROM oldprod
WHERE category IS NOT NULL);
上に戻る

解説について

投稿日 2026/05/27

解説

設問のSQL文の副問合せでは"10","40","NULL"が返されますが
"60"も含まれると思いますがどうでしょうか

この投稿に対して返信しませんか?