"注文"表と"製品"表に対して,次のSQL文を実行したときに得られる結果はどれか。
SELECT 製品名,数量 FROM 注文,製品
WHERE 注文.製品コード = 製品.製品コード
〔注文〕
日付|製品コード|数量/2011-04-10|P2|120/2011-04-15|P1|100/2011-04-22|P4|50/2011-04-30|P8|80/2011-05-06|P1|100/2011-05-08|P3|70
〔製品〕
製品コード|製品名/P1|PC/P2|テレビ/P3|掃除機/P4|冷蔵庫/P5|エアコン/P6|電話機/P7|時計
正答3
解説
正解は3です。
2つの表を製品コードで結合(内部結合)するSQL文の結果を問う問題です。
WHERE句の条件に合う行の組だけが結果に残り、相手のない行は出力されません。
【結合の手順】
「注文」表の各行について、同じ製品コードをもつ「製品」表の行を探します。
P2はテレビなので、テレビ・120の行ができます。
P1はPCなので、PC・100の行ができます。
P4は冷蔵庫なので、冷蔵庫・50の行ができます。
P8は「製品」表に存在しないので、この注文の行は結果に現れません。
2回目のP1もPCなので、PC・100の行がもう1行できます。
P3は掃除機なので、掃除機・70の行ができます。
結果は5行です。
【選択肢別解説】
1:× PC・100が1行しかありません。
注文にP1が2回あるので、PCの行は2行出力されます。
2:× PCの数量が200にまとめられています。
合計するにはGROUP BY句とSUM関数が必要ですが、本問のSQL文には含まれていません。
3:○ テレビ120、PC100、冷蔵庫50、PC100、掃除機70の5行です。
結合条件を満たす組がすべて出力され、P8の行は除かれています。
4:× 製品名がNULLで数量80の行が含まれています。
これは外部結合の結果であり、WHERE句による内部結合では相手のないP8の行は出力されません。
【ポイント】
WHERE句で等しい値の行を結び付けるのは内部結合(等結合)です。
相手のない行もNULLで残したいときは、LEFT OUTER JOINなどの外部結合を使います。