今回は「開発/SQL - SQLコマンド(SELECT文-副問い合わせ)」からの出題です。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2014年4月15日
SELECT文は、FROM句で指定したテーブルの各行について、WHERE句の条件を評価し、その結果が真であればその行を表示する、偽であれば表示しない、という動作をします。この例題では、testというテーブルに4行のデータがありますが、そのそれぞれに対して、WHERE句の条件を評価します。
WHERE句にあるEXISTSは、括弧内のSELECT文が1行でも結果を返せば真、1行も返さなければ偽という意味です。このようなSELECT文を副問い合わせ(サブクエリー)と呼びますが、この
select * from sub where id = id が行を返すかどうか、が問題になります。
副問い合わせのWHERE句で2回参照されるidですが、これらはいずれもsubテーブルのid列を参照します(testのid列でないことに注意)。従って、この副問い合わせは、testテーブルのどの行に対しても、3行のデータを返す、つまり真であることになります。
従って、正解は4行です。
副問い合わせは主問い合わせにあるテーブルの一部を参照するのが普通です。本当に実行したかったのは、
select * from test where exists (select * from sub where test.id = sub.id);
のようなselect文だったのかもしれませんね。実行して、結果を比較してみてください。
また、
select * from test, sub where test.id = sub.id;
との結果の違いにも注意してください。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.