PREPARATION
受験対策

Silverの例題解説「開発/SQL - SQLコマンド(SELECT文-副問い合わせ)」

今回は「開発/SQL - SQLコマンド(SELECT文-副問い合わせ)」からの出題です。

例題

3.41

次のような2つのテーブルtestとsubがある。いずれも、idはINTEGER型、valはTEXT型である。
=> select * from test;

id | val
---- + ----
1 | aaa
2 | BBB
2 | bbb
3 | ccc
(4 rows)
=> select * from sub;

id | val
---- + ----
1 | XXX
1 | xxx
2 | yyy
(3 rows)
次のSELECT文が返す行数を答えなさい。
=> select * from test where exists (select * from sub where id = id);

※この例題は実際の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事務局ではお応えできませんのでご了解ください。

企業の基幹システムや業務システムでの
OSS-DBの採用がますます拡大している中、
昇格・昇給・就職・転職に必ず役立つ認定資格になります

OSS-DBの受験対策について

受験の学習をサポートする情報や対策に役立つ情報をご紹介

サンプル問題/例題解説

例題 のアーカイブを試験ごとにまとめています。OSS-DB技術者認定試験の学習にお役立てください

学習教材・教育機関のご紹介

OSS-DB認定教材や教育機関について詳しくご説明いたします。

無料技術解説セミナー

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

OSS-DB道場

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

LPI-Japan
Platinum Sponsors