ITパスポート 2015年 秋期 問64
問題文
関係データベースで管理している“入館履歴”表と“建物”表から、建物名が‘東館’を条件に抽出した結果を日付の降順でソートしたとき、2番目のレコードの社員番号はどれか。

選択肢
ア:S0001
イ:S0002
ウ:S0003
エ:S0004(正解)
🔒 解説は解答すると表示されます
結合と日付の降順【ITパスポート解説】
正解の理由
入館履歴表と建物表を建物コードで結合(JOIN)し、建物名が「東館」の行だけを取り出します。その結果に対して日付を「降順(最新→過去)」で並べ替えると、東館に該当する4件の並びは「10/30 (S0001)」「10/20 (S0004)」「10/12 (S0003)」「10/10 (S0002)」になります。したがって2番目の社員番号は S0004 で、選択肢では エ が該当します。
(ポイントの用語説明)
- JOIN(表結合): 2つ以上の表を共通の列でつなぎ、関連する行を組み合わせる操作
- ORDER BY(並べ替え): 結果を指定した列の大小や日付順で並べ替える命令
- 降順: 大きい/新しい→小さい/古いの順(英: DESC)
解法ステップ
- 建物表で「建物名=東館」に対応する建物コードを確認する。
- 建物コード B002 が東館。
- 入館履歴表から建物コードが B002 の行だけを抜き出す。該当行は次の4件。
- S0001 10/30、S0002 10/10、S0003 10/12、S0004 10/20
- これらを日付で降順(最新→過去)に並べ替える。順序は 10/30 → 10/20 → 10/12 → 10/10。
- 並べ替え後の2番目を見ると社員番号は S0004。よって選択肢は エ。
(SQLの一例)
-- 日付が文字列で "MM/DD" 形式かつゼロ埋め済みの場合
SELECT r.社員番号
FROM 入館履歴 r
JOIN 建物 b ON r.建物コード = b.建物コード
WHERE b.建物名 = '東館'
ORDER BY r.日付 DESC;
-- 日付が文字列でゼロ埋めされていない可能性がある場合(MySQL例)
SELECT r.社員番号
FROM 入館履歴 r
JOIN 建物 b ON r.建物コード = b.建物コード
WHERE b.建物名 = '東館'
ORDER BY STR_TO_DATE(r.日付, '%m/%d') DESC;
選択肢別の誤答解説
- ア: S0001
- S0001 の東館での最新記録は 10/30 で、これは1番目に来ます。したがって2番目ではない。
- イ: S0002
- S0002 の東館記録は 10/10 で、日付順では一番古く、4番目になる。
- ウ: S0003
- S0003 の東館記録は 10/12 で、並べ替え後は3番目であり2番目ではない。
- エ: S0004
- S0004 の東館記録は 10/20 で、並べ替え後の2番目に位置するため正解。
よくある誤解
- 文字列としてソートすれば常に正しい順になると思い込む
- 文字列ソートだと形式に依存します。特に日付の表記で桁揃え(ゼロ埋め)がないと誤順になることがあります。例:文字列ソートでは「10/12」が「10/5」より先に来てしまい(誤順)、見かけ上の順序と実際の日時順がずれることがあります。
- 建物名を見落として入館履歴だけで判断する
- 問題は「東館」に限定する点が重要です。建物コードを確認してから絞り込まないと、別の建物の記録を誤って使ってしまいます。
- 降順と昇順を逆に理解する
- 降順(DESC)は「最新→古い」、昇順(ASC)は「古い→最新」です。問題文の「降順」を見落とすと逆の順位を答えてしまいます。
補足コラム
- 日付データの扱い方
- データベースにおける日付は、可能なら日付型(DATE や DATETIME)で保存するのがベストです。日付型なら並べ替えや比較が確実に正しく動きます。文字列で保存する場合は "YYYY-MM-DD" のような形式か、月・日を常に2桁(10/05 のようにゼロ埋め)にしておくと文字列ソートでも日時順が保たれます。
- 「MM/DD」表記の落とし穴
- 月や日が一桁のときにゼロを付けないと、文字列比較では「10/12」より「10/5」の順序がおかしくなることがあります。見た目の表記と内部表現が一致しているか確認しましょう。
FAQ
Q1. 同じ日付が複数ある場合、どれが先になりますか?
A1. 同じ並べ替えキー(この場合は日付)で順位が決まらないと、DBMSによって元の格納順が維持されるとは限りません。確実に順序を決めたいときは、追加の並べ替え条件(例えば社員番号)を付けて ORDER BY 日付 DESC, 社員番号 ASC のようにします。
A1. 同じ並べ替えキー(この場合は日付)で順位が決まらないと、DBMSによって元の格納順が維持されるとは限りません。確実に順序を決めたいときは、追加の並べ替え条件(例えば社員番号)を付けて ORDER BY 日付 DESC, 社員番号 ASC のようにします。
Q2. 日付が文字列で保存されているか確認する方法は?
A2. 実務ではデータ定義(テーブル設計)を見るか、サンプル値を調べます。値が "2023-10-05" のようなら日付型、"10/5" のようなら文字列の可能性が高いです。設計書やテーブル定義(スキーマ)を確認してください。
A2. 実務ではデータ定義(テーブル設計)を見るか、サンプル値を調べます。値が "2023-10-05" のようなら日付型、"10/5" のようなら文字列の可能性が高いです。設計書やテーブル定義(スキーマ)を確認してください。
Q3. 表示では「10/5」でも内部は別の形式のことはありますか?
A3. はい。表示上のフォーマットと内部保存形式は異なることがあります。アプリが表示用に整形している場合、内部は正しい日付型で保存されていることもあります。確認が必要です。
A3. はい。表示上のフォーマットと内部保存形式は異なることがあります。アプリが表示用に整形している場合、内部は正しい日付型で保存されていることもあります。確認が必要です。
関連キーワード: SQL、JOIN、ORDER BY、日付フォーマット、文字列ソート、降順、データ型、並べ替え

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

