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

選択肢
ア:S0001
イ:S0002
ウ:S0003
エ:S0004(正解)
🔒 解説は解答すると表示されます
問題タイトル +【ITパスポート 解説】
関係データベースで管理している“入館履歴”表と“建物”表から、建物名が‘東館’を条件に抽出した結果を日付の降順でソートしたとき、2番目のレコードの社員番号はどれか。
正解の理由
まず「建物名が『東館』」という条件は、入館履歴表の「建物コード」と建物表の「建物コード」を結びつけ(これを結合/JOINと言います)、対応する建物名が東館である行だけを残す操作です。結合の結果、東館に該当する入館履歴は次の4件になります。
- S0001 — 10/30
- S0004 — 10/20
- S0003 — 10/12
- S0002 — 10/10
これを「日付の降順(新しい日付から順)」で並べると、上の順番になります。2番目に来る社員番号は S0004 です。選択肢でいうと エ が正しい理由はここにあります。
(補足)日付は月/日(MM/DD)形式で与えられており、同じ年内の比較と考えるとシンプルに日付の大小で並べ替えできます。
解法ステップ
- 入館履歴表と建物表を「建物コード」で結合する。
- 用語:JOIN(英: join:結合)。表どうしをキーでつなぎ、関連する列を取り出す操作です。
- 結合結果から「建物名 = '東館'」を条件に抽出する(フィルタリング)。
- 建物表で B002 が 東館なので、入館履歴の B002 の行を残す。
- 残った行を日付で降順(新しい順)にソートする。
- 日付は MM/DD なので、正しく日付として扱って比較する(文字列ソートだと誤る可能性あり)。
- ソートした結果の2番目の行の社員番号を答える(ここでは S0004)。
手順を表にすると:
- フィルタ前(入館履歴の B002 の行):
- S0001 10/30
- S0002 10/10
- S0003 10/12
- S0004 10/20
- 降順にソート:
- 10/30 (S0001)
- 10/20 (S0004) ← 2番目
- 10/12 (S0003)
- 10/10 (S0002)
実務的なSQL例(イメージ):
-- 日付がDATE型で格納されている場合
SELECT r.社員番号, r.日付
FROM 入館履歴 r
JOIN 建物 b ON r.建物コード = b.建物コード
WHERE b.建物名 = '東館'
ORDER BY r.日付 DESC;
-- 日付が文字列 (MM/DD) の場合(MySQL の例)
SELECT r.社員番号, 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番目」を問われています。1番目と混同した誤答です。
- イ: S0002
- S0002 は東館ではありますが、日付は 10/10 で4件中の最も古く、2番目ではありません。
- ウ: S0003
- S0003 は東館で日付は 10/12。降順では3番目になり、2番目ではありません。
- エ: S0004
- 10/20 で、東館の中で降順2番目。よって正解です(選択肢では エ)。
よくある誤解
- 日付を文字列としてそのままソートする
- 例:「10/5」と「10/12」を文字列ソートすると「10/5」が先に来てしまうことがあります('1' vs '1' の次の文字比較で誤順)。日付は日付型に変換してから比較するか、日付表記をゼロ埋め(10/05)してから扱うと安全です。
- 「建物コード」でフィルタするだけで済むと思う
- 今回は B002 が東館なので結果は同じですが、問題文が「建物名が '東館'」と指定している場合は建物表との結合(名前の確認)が正しい手順です。コードと名前が対応していることを明確にする意識が大事です。
- ソートの向きを間違える(昇順と降順を取り違える)
- 「降順(降べき)」は新しい→古い(大きい→小さい)。問題文の向きを確認してください。
補足コラム
- リレーショナルデータベース(関係データベース):表(テーブル)でデータを整理する方式で、行がレコード、列が項目です。表どうしは「キー」と呼ぶ共通の列で結びつけられます(外部キー)。
- JOIN の種類:今回のように対応する行を結びつけるのは「内部結合(INNER JOIN)」が一般的です。結合とフィルタを分けて考えると理解しやすくなります。
- 日付の扱いは重要:実務でもよくあるミスが日付の文字列扱いです。日付はできるだけ日付型で保存・比較しましょう。
FAQ
Q1. 「降順」ってどういう意味ですか?
A1. 降順(こうじゅん)は大きいものから小さいものへ並べることです。日付では「新しい日付→古い日付」です。
A1. 降順(こうじゅん)は大きいものから小さいものへ並べることです。日付では「新しい日付→古い日付」です。
Q2. 日付が同じ場合はどうやって2番目を決めますか?
A2. 問題に別の基準がなければ、同じ日付の複数行は順序が未定義です。実務では追加のソートキー(社員番号など)を指定して安定した順序にします。例:ORDER BY 日付 DESC, 社員番号 ASC。
A2. 問題に別の基準がなければ、同じ日付の複数行は順序が未定義です。実務では追加のソートキー(社員番号など)を指定して安定した順序にします。例:ORDER BY 日付 DESC, 社員番号 ASC。
Q3. 建物コードを直接使ってもいいですか?
A3. 結果は同じ場合もありますが、問題文が「建物名で抽出」と明示しているときは建物表と結合して名前を確認する回答手順を使うのが正しいアプローチです。
A3. 結果は同じ場合もありますが、問題文が「建物名で抽出」と明示しているときは建物表と結合して名前を確認する回答手順を使うのが正しいアプローチです。
関連キーワード: SQL、JOIN、ORDER BY、日付ソート、リレーショナルデータベース

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

