平成21年度 秋期 午前 問33
データベース
SQLの構文
SQL の構文として,正しいものはどれか。
- ア`SELECT 注文日, AVG(数量) FROM 注文明細`
- イ`SELECT 注文日, AVG(数量) FROM 注文明細 GROUP BY 注文日`
- ウ`SELECT 注文日, AVG(SUM(数量)) FROM 注文明細 GROUP BY 注文日`
- エ`SELECT 注文日 FROM 注文明細 WHERE SUM(数量) > 1000 GROUP BY 注文日`
答えと解説を見る
✓ これが正解イ`SELECT 注文日, AVG(数量) FROM 注文明細 GROUP BY 注文日`
解説
束ねる単位と選ぶ列がそろった構文が成立します。
まとめて計算する関数を使うと、複数の行がひとつの値に縮みます。ここで問題になるのが、縮んだ値と、行ごとに違う値を同じ結果の行に並べられるかどうかです。並べるためには、どの単位でまとめるのかをあらかじめ宣言しておく必要があり、その役目を担うのが GROUP BY です。ですから軸はこの一点で、取り出そうとしている列と、束ねる単位がそろっているかを見ます。あわせて、句を書く並びと処理される順序も確かめます。どこから取るかを決め、行ごとの条件で絞り、束ね、束ねた後の条件で絞り、最後に列を選ぶ、という順序に照らすと、まだ存在していない値を使おうとしている SQL の誤りが見分けられます。
ほかの選択肢はなぜ違うのか
- ア`SELECT 注文日, AVG(数量)…:まとめた結果は表全体でひとつの値になるのに、日付の列は行ごとに異なります。束ねる単位を宣言していないため、この二つを同じ結果の行に並べられません。
- ウ`SELECT 注文日, AVG(SUM…:まとめる関数の中に、さらにまとめる関数を書いています。二段の集約を一度には書けず、必要ならいったん束ねた結果を別の問合せにして、その外側でもう一度まとめます。
- エ`SELECT 注文日 FROM 注文明…:束ねる前の一行ずつに当てる条件の中で、束ねた後にしか決まらない値を使っています。束ねた後の条件は、別に用意された句を使って GROUP BY の後に書きます。
出典:平成21年度 秋期 基本情報技術者試験 午前 問33
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)