応用情報技術者 2010年 春期 午前2 問33
問題文
表Aから実行結果Bを得るためのSQL文はどれか。

選択肢
ア:
SELECT 部署コード, 社員コード, 名前 FROM A
GROUP BY 社員コード
イ:
SELECT 部署コード, 社員コード, 名前 FROM A
GROUP BY 部署コード
ウ:
SELECT 部署コード, 社員コード, 名前 FROM A
ORDER BY 社員コード, 部署コード
エ:
SELECT 部署コード, 社員コード, 名前 FROM A
ORDER BY 部署コード, 社員コード
(正解)🔒 解説は解答すると表示されます
複合キーによるソート【午前2解説】
正解の理由
実行結果Bはまず部署コードの昇順で並び、その中で社員コードの昇順に並んでいます。これはSELECTの結果に対して並べ替え(ソート)を行うORDER BY句を「部署コード, 社員コード」の順で指定することで得られます。したがって正しい文は エ の
ORDER BY 部署コード, 社員コード を使った文です。ORDER BYは結果セットをソートするものであり、グループ化(集約)を行うものではありません。正しいSQL例:
SELECT 部署コード, 社員コード, 名前
FROM A
ORDER BY 部署コード, 社員コード;
解法ステップ
- 実行結果Bの行順を観察する(部署コードが先、同じ部署の中は社員コードで昇順)。
- ソートのキーとキーの優先順(第一キー:部署コード、第二キー:社員コード)を特定する。
- 選択肢のうちORDER BYでその順序を表現しているものを選ぶ(GROUP BYはソートではないので除外)。
- 昇順が明示されていない場合、SQLのデフォルトが昇順であることを確認する(必要ならASCを明記)。
選択肢別の誤答解説
-
ア: GROUP BY 社員コード
GROUP BYは行をグループ化して集約を行うための句であり、今回のように全行をソートして出力する目的には合いません。さらにSELECTに含まれる他の列(部署コード、名前)が集約関数で囲まれていない場合、多くのDBでは構文エラーまたは非決定的な結果になります。 -
イ: GROUP BY 部署コード
これも同様にグループ化を行う句です。部署ごとに1行にまとめる意図であり、実行結果Bのように部署内の複数行をそのまま出力して並べることはしません。 -
ウ: ORDER BY 社員コード, 部署コード
ORDER BYは正しい構文ですが、キーの順序が逆です。社員コードを第一キーにすると全体が社員コード昇順(10010,10020,10030...)になり、求める「部署ごと、かつ部署内で社員コード昇順」の並びと一致しません。 -
エ: ORDER BY 部署コード, 社員コード
正解です。第一キーで部署コードを昇順に並べ、同じ部署内では第二キーの社員コードで昇順に並べるため、実行結果Bと一致します。
よくある誤解
-
ORDER BYはグループ化(GROUP BY)と同義だと誤解する
→ GROUP BYは集約のための句、ORDER BYは出力順を決める句で目的が異なります。ここでは明確にソートが必要です。 -
ORDER BYで列順を指定するだけでいいと考え、キーの順序を見落とす
→ 並び順は第一キー→第二キーの優先度で決まるため、実行結果の先頭から順にキーを読み取ることが重要です。 -
ORDER BYで昇順/降順を指定しないと動作が不定と思う
→ 多くのSQL実装でデフォルトは昇順(ASC)です。必要なら明示的に ASC / DESC を書くと良いです。
補足コラム
- 明示的にASCを付けると可読性が上がります:
SELECT 部署コード, 社員コード, 名前 FROM A ORDER BY 部署コード ASC, 社員コード ASC; - パフォーマンス面では、(部署コード, 社員コード) の複合インデックスがあればORDER BYのソート処理を回避できることがあり、高速化につながります(DBエンジンによる)。
- ORDER BYはテーブルそのものの並びを変更するのではなく、クエリ結果の並びを決めるだけです。テーブルの物理順序は別扱いです。
- ソートを完全に決定するためには、必要に応じてすべての同値ケースで判定可能な順序キーを指定してください(同一キーのみでは順序が確定しないことがあります)。
FAQ
Q: GROUP BYでも同じ並びになることはあるか?
A: 結果として同じ順序に見える場合はあるものの、GROUP BYは並べ替えを意図した句ではありません。GROUP BYは集約目的で使うものであり、並び保証をするにはORDER BYを使うべきです。
A: 結果として同じ順序に見える場合はあるものの、GROUP BYは並べ替えを意図した句ではありません。GROUP BYは集約目的で使うものであり、並び保証をするにはORDER BYを使うべきです。
Q: ORDER BYに列名ではなく列番号を使えるか?
A: 多くのDBではSELECT句中の列番号(1, 2, ...)でORDER BYを指定できますが、可読性と保守性のため列名やエイリアスを使うことを推奨します。
A: 多くのDBではSELECT句中の列番号(1, 2, ...)でORDER BYを指定できますが、可読性と保守性のため列名やエイリアスを使うことを推奨します。
関連キーワード: SQL、ORDER BY、GROUP BY、ソート、昇順、複合キー、SELECT

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

