データベースの基礎
顧客表(顧客ID, 氏名)には (C1, 青木)、(C2, 井上)、(C3, 上田)、(C4, 江藤) の4行がある。注文表(注文ID, 顧客ID, 金額)には (O1, C1, 3000)、(O2, C2, 8000)、(O3, C1, 6000)、(O4, C3, 2000)、(O5, C2, 9000) の5行がある。SELECT 氏名 FROM 顧客 WHERE 顧客ID IN (SELECT 顧客ID FROM 注文 WHERE 金額 > 5000) の結果は何行になるか。
- A1行
- B2行
- C3行
答えと解説を見る
正解:B. 2行
まず括弧の中の副問い合わせ(サブクエリ)が、金額が5000を超える注文の顧客IDを返します。該当するのはO2(C2)、O3(C1)、O5(C2)の3件なので、顧客IDの集まりは C2、C1、C2 です。外側の問い合わせは、顧客表の各行について、顧客IDがこの集まりに含まれるかどうかを調べます。含まれるのは青木(C1)と井上(C2)で、井上は集まりに2回現れても、顧客表の1行として1回だけ返るので、結果は2行です。3行は、顧客表と注文表を結合してから金額で絞った場合のように、該当する注文の件数だけ行ができると考えた場合の数です。1行は、すべての注文が5000を超える顧客(井上)だけを数えた場合の数です。
- A. すべての注文が5000を超える顧客だけを数えた場合です。INは、該当する注文が1件でもあれば含めます。
- B. 正しい。5000を超える注文がある青木と井上の2行です。
- C. 結合して注文ごとに行を作った場合の数です。INでは同じ顧客は1回だけ返ります。