GROUP BY と HAVING
表「受注」に対して次の SQL 文を実行したとき,結果として得られる顧客コードをすべて挙げたものはどれか。
受注(受注番号,顧客コード,金額)
1,C1,500
2,C2,1200
3,C3,300
4,C1,600
5,C3,400
6,C2,200
7,C3,800
8,C4,900SELECT 顧客コード FROM 受注
WHERE 金額 >= 500
GROUP BY 顧客コード
HAVING SUM(金額) >= 1000- アC2
- イC1,C2
- ウC1,C2,C3
- エC1,C2,C3,C4
正解と解説を見る
正解 イ
この問題の基礎知識
- SELECT 文は,FROM で表を指定し,WHERE で行を絞り込み,GROUP BY でグループ化し,HAVING でグループを絞り込み,SELECT で列を取り出すという順に評価すると考える。
- WHERE 句はグループ化の前に個々の行に条件を適用し,HAVING 句はグループ化の後にグループごとの集計値に条件を適用する。
- 集計関数として,SUM はグループ内の値の合計,COUNT は行数,AVG は平均,MAX と MIN は最大値と最小値を求める。
アC2
HAVING の条件を個々の行の金額に適用し,金額が 1000 以上の行をもつ C2 だけとした誤りである。HAVING はグループ化した後の集計値に対して適用される。
イC1,C2正解
WHERE で金額が 500 以上の行(受注番号 1,2,4,7,8)に絞り込んでから顧客ごとに合計すると,C1 が 1100,C2 が 1200,C3 が 800,C4 が 900 となり,1000 以上は C1 と C2 である。
ウC1,C2,C3
WHERE 句を無視して全行で合計した結果である。その場合 C3 は 300+400+800=1500 となるが,WHERE はグループ化の前に適用されるので,C3 の合計は 800 となり条件を満たさない。
エC1,C2,C3,C4
HAVING 句を無視し,WHERE で残った行の顧客コードをすべて挙げた結果である。HAVING により合計金額が 1000 未満の C3(800)と C4(900)は除外される。
検証用の出典レビュー済み
JIS X 3005-2 データベース言語 SQL 第 2 部:基本機能(SQL/Foundation)