ホーム > データベーススペシャリスト試験 > 2021年
データベーススペシャリスト試験 2021年 午前2 問10
ある電子商取引サイトでは会員の属性を柔軟に変更できるように“会員項目”表で管理することにした。“会員項目”表に対し次の条件でSQL文を実行して結果を得る場合SQL文のaに入れる字句はどれか。ここで、実線の下線は主キーを、NULLは値がないことを表す。
〔条件〕
(1)同一“会員番号”をもつ複数の行によって、1人の会員の属性を表す。
(2)新規に追加する行の行番号は、最後に追加された行の行番号に1を加えた値とする。
(3)同一“会員番号”で同一“項目名”の行が複数ある場合、より大きい行番号の項目値を採用する。

ア:COUNT
イ:DISTINCT
ウ:MAX(正解)
エ:MIN
解説
会員項目表の最新属性抽出SQL文の字句選択【午前2 解説】
要点まとめ
- 結論:最新の行番号を取得するために、サブクエリの行番号抽出部分には「MAX」を使うのが正解です。
- 根拠:同一会員番号・項目名で複数行ある場合、行番号が最大の行の項目値を採用する条件に合致します。
- 差がつくポイント:GROUP BYで最大値を取る意図を理解し、COUNTやDISTINCTではなく集約関数MAXを選ぶことが重要です。
正解の理由
問題の条件(3)により、同一会員番号かつ同一項目名の複数行がある場合は、行番号が最も大きい行の項目値を採用します。
このため、サブクエリで「GROUP BY 会員番号, 項目名」したうえで、行番号の最大値を抽出する必要があります。
選択肢の中で「MAX」は最大値を取得する集約関数であり、これが正しい字句です。
このため、サブクエリで「GROUP BY 会員番号, 項目名」したうえで、行番号の最大値を抽出する必要があります。
選択肢の中で「MAX」は最大値を取得する集約関数であり、これが正しい字句です。
よくある誤解
COUNTは件数を数える関数であり、最大値を取得できません。DISTINCTは重複排除であり、集約関数ではありません。MINは最小値を取得するため条件に合いません。
解法ステップ
- 問題文の条件を整理し、最新の属性値を取得するためには「行番号の最大値」を使うことを理解する。
- サブクエリで「会員番号」と「項目名」でグループ化し、各グループの最大行番号を抽出する必要があると判断する。
- 集約関数の中から最大値を取得する「MAX」を選択肢から選ぶ。
- SQL文に「MAX(行番号)」を入れて実行結果を確認し、条件通りの結果になることを確認する。
選択肢別の誤答解説
- ア: COUNT
行番号の数を数えるだけで、最新の行番号を取得できず誤り。 - イ: DISTINCT
重複排除のためのキーワードであり、集約関数ではないため不適切。 - ウ: MAX
最大の行番号を取得し、最新の属性値を抽出するため正解。 - エ: MIN
最小の行番号を取得するため、最新の行番号を求める条件に合わない。
補足コラム
SQLで最新のレコードを抽出する際は、グループ化と集約関数の組み合わせがよく使われます。
今回のように複数の属性を持つ場合は、サブクエリで最新の行番号を特定し、その行の値を取得する方法が効率的です。
また、CASE文を使って属性ごとに列を分けるテクニックも重要なSQLスキルです。
今回のように複数の属性を持つ場合は、サブクエリで最新の行番号を特定し、その行の値を取得する方法が効率的です。
また、CASE文を使って属性ごとに列を分けるテクニックも重要なSQLスキルです。
FAQ
Q: なぜMAXでなくMINを使ってはいけないのですか?
A: MINは最小値を取得するため、最新の行番号(最大値)を取得する条件に合いません。
A: MINは最小値を取得するため、最新の行番号(最大値)を取得する条件に合いません。
Q: COUNTやDISTINCTはどんな場合に使いますか?
A: COUNTは件数を数えるとき、DISTINCTは重複を除外してユニークな値を取得するときに使います。
A: COUNTは件数を数えるとき、DISTINCTは重複を除外してユニークな値を取得するときに使います。
関連キーワード: SQL, 集約関数, MAX関数, グループ化, CASE文, 属性管理, 最新レコード抽出