今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド」からの出題です。
2行
3行
4行
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2013年1月24日
RDBMSではデータを正規化して複数の表に分けて格納するのが普通です。データを検索するときには、これら複数の表を結合して、あたかも1つの表であるかのようにして扱います。このときに使われるのがJOIN句です。
JOIN句を使うSELECT文の基本的な構文は
SELECT column_list ←(表示したい列)
FROM table1 ←(検索対象の表)
JOIN table2 ←(結合対象の表)
ON condition ←(結合条件)
となります。例えば、上の例で、id列の値が同じデータを結合する場合、
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id;
などと記述することで結合できます。
これを実行した時の結果は、
id|val|id|val
----+-----+----+-----
1|aaa|1|xxx
1|aaa|1|yyy
(2 行)
となり、id=1の行だけが返されます。t1にはid=1の行が1つしかありませんが、t2には2つあります。この場合、id=1の行が2行になって返され、t1については同じ内容が繰り返し表示されることに注意してください。
一方で、t1にはid=2の行がありますが、結合できる行がt2にありませんから、これは返されません。同じようにt2のid=3の行も返されません。
このような一方のテーブルだけに存在する行も返して欲しい場合もあるでしょう。そんなときに使われるのが外部結合です。外部結合をするためには、JOINの前にLEFT/RIGHT/FULLの修飾を付加します。
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id;
とすると、t1には存在するがt2に存在しない行(つまりid=2の行)も返され、結果は以下のようになります。
id|val|id|val
----+-----+----+-----
1 |aaa |1 |xxx
1 |aaa |1 |yyy
2 |bbb| |
(3 行)
RIGHT JOINとすると、これとは逆にt2に存在するがt1に存在しない行(id=3の行)も返されます。FULL JOINとすると、これらの両方が返されます。
結合元と結合先の列名が同じ時は、ON句の代わりにUSING句を使って記述を簡略化することができます。USINGの後に結合に使う列名を括弧で括り、以下のように記述します。
SELECT * FROM t1 FULL JOIN t2 USING (id);
これを実行した時の結果は
id|val|val
----+-----+----
1 |aaa|xxx
1 |aaa|yyy
2 |bbb|
3 ||zzz
(4 行)
となりますので、正解は D です。
ON句を使った時とは結果として返される列の数が違う(id列が統合される)ということにも注意してください。
なお、USINGをさらに簡略化して、NATURAL JOINとする方法もありますが、この場合、結合元と結合先で名前が同じ列がすべて結合対象となることに注意が必要です。この例題の表では、t1とt2の両方にval列があるため、
SELECT * FROM t1 NATURAL FULL JOIN t2;
とすると、これは
SELECT * FROM t1 FULL JOIN t2 USING (id, val);
と同等になってしまいます。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.