PREPARATION
受験対策

Silverの例題解説
「S3.1 SQL コマンド(SELECT文)」

今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド(SELECT文)」からの出題です。

例題

3.94

次のSELECT文がエラーにならずに実行できるものとする。
SELECT * FROM x, y WHERE x.a = y.a;
これと必ず同じ行を返すSELECT文をすべて選びなさい。

  1. SELECT * FROM x JOIN y ON a;

  2. SELECT * FROM x JOIN y USING a;

  3. SELECT * FROM x JOIN y USING (a);

  4. SELECT * FROM x NATURAL JOIN y;

  5. SELECT * FROM x NATURAL JOIN y ON a;

※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2018年12月26日

解答と解説

複数のテーブルを結合する場合、例題の問題文中にあるようにFROM句にカンマで区切ってテーブルを並べ、結合条件をWHERE句に記述する方法と、選択肢のようにJOIN句に結合されるテーブルと結合条件を記述する方法があります。本問はJOIN句の記述方法を正しく理解できているかどうかを問う問題です。
JOIN句には結合先のテーブル名と結合条件を記述しますが、ここで使われる結合条件の形式が2種類あります。これら2つの方法を混同しないように注意してください。
1つは x.a = y.a のような論理式を書く方法で、この場合は ON の後にその論理式を記述します。例題のSELECT文と同等のものをこの方法で記述すると、
SELECT * FROM x JOIN y ON x.a = y.a;
となります。選択肢AのようにONの後に列名だけを書くと通常はエラーになりますし、少なくとも、例題のSELECT文と同等にはなりません。
もう一つは、結合に使用する列名が2つのテーブルで同じときにのみ使用できる簡略記法で、USINGの後に結合に使用する列のリストをカッコで囲んで記述します。例題のSELECT文と同等のものをこの方法で記述すると、
SELECT * FROM x JOIN y USING (a);
となります。これは選択肢Cと同じですね。選択肢Bのようにカッコを付けないで記述すると構文エラーになります。
結合に使用する2つのテーブルに共通する名前の列をすべて結合条件に使用する場合は、選択肢DのようにNATURAL JOINを使用してUSING以下を省略することができます。ただし、同じ名前の列名があればすべて使われてしまうため、例えばテーブルxとテーブルyの両方に列bが存在する場合、選択肢Dは
SELECT * FROM x, y WHERE x.a = y.a AND x.b = y.b;
と同等になります。すなわち、例題の条件である「必ず同じ行を返す」には合致しません。
NATURAL JOINはUSINGを省略するための形式なので、ONやUSINGの条件を重ねて使用することはできず、選択肢Eは構文エラーになります。

従って、正解はCです。

なお、選択肢Cは例題と同じ行を返すものの、返す列の数が異なります。実際に実行して確認してください。また、なぜそうなるのか、考えてみましょう。

今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。

※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。

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

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

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

サンプル問題/例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

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

LPI-Japan
Platinum Sponsors