今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド(SELECT文)」からの出題です。
SELECT * FROM x JOIN y ON a;
SELECT * FROM x JOIN y USING a;
SELECT * FROM x JOIN y USING (a);
SELECT * FROM x NATURAL JOIN y;
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事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.