基本情報技術者試験のSQL・データベース問題を解説!正規化・結合の攻略法

基本情報技術者試験において、データベース分野は毎回必ず出題される重要テーマです。SQLや正規化の知識は、科目A(旧午前問題)でも科目B(旧午後問題)でも問われるため、しっかりと理解しておく必要があります。

私自身、最初はSQLの構文や正規化の概念が難しく感じていましたが、実際のデータで考えるようにしてから理解が一気に深まりました。この記事では、試験に出やすいポイントを絞って丁寧に解説します。

データベースの問題は「正規化」と「SQL操作」の2本柱を押さえれば、確実に得点できます。ぜひ最後まで読んで、自信を持って本番に臨んでください。

この記事のポイント
  • 正規化の3段階(第1〜第3正規形)の違いと覚え方がわかる
  • SELECT・JOIN・GROUP BYなど頻出SQL構文を実例で理解できる
  • INNER JOINとOUTER JOINの違いを図解的に把握できる
  • ERD(エンティティ関係図)の読み方と試験での活用方法がわかる
無料

基本情報技術者試験 過去問アプリ

本番形式で繰り返し解ける。スキマ時間に1問から

2,000問以上収録
無料で過去問を解く
目次

基本情報技術者試験のデータベース問題とは?正規化を完全マスターする

基本情報技術者試験 データベース 正規化

データベース問題の出題傾向と配点を知る

基本情報技術者試験のデータベース分野は、科目A・科目Bの双方に登場します。科目Aでは4択形式で、正規化の概念・SQLの文法・関係代数などが問われます。科目Bでは実際のSQLクエリを読み解いたり、テーブル設計の問題が出たりすることがあります。

出題頻度は非常に高く、データベース関連の問題は毎回3〜5問程度出題されます。配点は1問あたり1点(科目Aは100問中の数問)ですが、正規化とSQLは確実に正答できる分野であるため、しっかり対策すれば得点源になります。

試験対策で大切なのは、「なんとなく覚える」ではなく「仕組みを理解する」ことです。データベースは理屈が通った学問なので、一度原理を理解すれば応用問題にも対応できます。過去問を解きながら、なぜその答えになるのかを確認する学習スタイルが最も効果的です。

科目Aの過去問はIPAの公式サイトから無料で入手できます。データベース分野だけを抜き出して集中的に解くのがおすすめです。

また、基本情報技術者試験では「出題範囲」が公開されており、データベースはテクノロジ系の中でも特に重要な位置づけです。出題範囲をしっかり把握した上で学習を進めることが、効率的な試験対策につながります。

正規化とは何か?非正規形から第1正規形への変換

正規化とは、データベースの設計において、データの冗長性を排除し、更新時の異常を防ぐためにテーブルを整理するプロセスです。正規化を行うことで、データの一貫性が保たれ、保守性の高いデータベースを構築できます。

非正規形(正規化されていない状態)では、1つのセルに複数の値が入っていたり、同じ情報が複数行に繰り返されていたりします。たとえば、「注文テーブル」に「商品1, 商品2, 商品3」という形で複数の商品が1つのフィールドに格納されているのが非正規形の典型例です。

第1正規形(1NF)は、「繰り返しグループを排除し、すべての属性が原子値(これ以上分割できない値)を持つ状態」です。先ほどの例であれば、注文ごとに1行ずつレコードを分け、1つのフィールドには1つの値だけが入るようにします。

正規形解消する問題キーワード
非正規形繰り返しグループ・複数値整理前の状態
第1正規形(1NF)繰り返しグループを排除原子値・分割
第2正規形(2NF)部分関数従属を排除完全関数従属
第3正規形(3NF)推移的関数従属を排除直接依存

第1正規形への変換は、データベース設計の第一歩です。試験では「次のテーブルは何正規形か?」という問題が頻出なので、各正規形の定義を正確に理解しておきましょう。

第2正規形(部分関数従属の排除)を実データで理解する

第2正規形(2NF)は、「第1正規形を満たしつつ、主キーの一部だけに従属する属性(部分関数従属)を別テーブルに分離した状態」です。これは複合主キーを持つテーブルで問題になります。

たとえば、注文明細テーブルに「注文ID」「商品ID」「商品名」「数量」があるとします。主キーは「注文ID+商品ID」の複合キーですが、「商品名」は「商品ID」だけで決まります。つまり、「商品名」は主キーの一部(商品ID)にしか従属していない=部分関数従属です。

この問題を解消するには、「商品名」を「商品ID」をキーとする別テーブル(商品マスタ)に移します。元の注文明細テーブルには「注文ID」「商品ID」「数量」だけを残します。これが第2正規形への変換です。

部分関数従属のチェックポイント:「その属性は主キー全体で決まるか?主キーの一部だけで決まってしまわないか?」を問いかけると判断しやすくなります。

第2正規形を理解するコツは、「商品名が変わったとき、何行書き換えなければならないか?」を考えることです。複数行の書き換えが必要なら、それは設計上の問題(更新異常)であり、正規化で解決すべきポイントです。実際のデータで考えると、抽象的な定義よりもずっと理解しやすくなります。

第3正規形(推移的関数従属の排除)と正規化の完成

第3正規形(3NF)は、「第2正規形を満たしつつ、主キーに直接依存しない属性(推移的関数従属)を別テーブルに分離した状態」です。推移的関数従属とは、「A→B→C」という形で、主キーAがBを決め、BがCを決める関係のことです。

たとえば、社員テーブルに「社員ID」「部署ID」「部署名」があるとします。「部署名」は「社員ID」から直接決まるのではなく、「社員ID→部署ID→部署名」という推移的な関係で決まります。これが推移的関数従属です。

解決策は、「部署ID」と「部署名」を別テーブル(部署マスタ)に切り出すことです。社員テーブルには「社員ID」「部署ID」だけを残し、部署名が必要なときは結合(JOIN)で取得します。これにより、部署名の変更が1か所の修正で済むようになります。

  • 第1正規形:繰り返しグループを排除(原子値)
  • 第2正規形:部分関数従属を排除(完全関数従属)
  • 第3正規形:推移的関数従属を排除(直接依存)

試験では正規化の定義を問う問題と、「このテーブルは何正規形に違反しているか?」という判定問題の両方が出ます。各正規形の定義を暗記するだけでなく、実際のテーブルを見て判断できる力を身につけることが大切です。

ERD(エンティティ関係図)の読み方と試験での使い方

ERD(Entity Relationship Diagram、エンティティ関係図)は、データベースのテーブル間の関係を図で表したものです。基本情報技術者試験では、ERDを読み解いて設計の意図を理解する問題や、ERDからSQL文を作成する問題が出題されます。

ERDの基本要素は「エンティティ(テーブル)」「属性(カラム)」「リレーションシップ(関係)」の3つです。リレーションシップには「1対1」「1対多」「多対多」の種類があり、それぞれ線の端の記号(カーディナリティ)で表現されます。

試験で特に重要なのは「1対多」の関係です。たとえば、「1人の顧客が複数の注文を持つ」という関係は1対多であり、注文テーブルに「顧客ID」という外部キーを持たせることで実装します。ERDを見たとき、どのテーブルが外部キーを持つかを即座に判断できるようにしておきましょう。

多対多の関係(例:学生と授業)は、直接実装できません。間に「中間テーブル」(例:履修テーブル)を置くことで、2つの1対多の関係に分解します。この設計パターンは試験頻出です。

ERDを読む練習は、実際のサービス(図書館システム、通販システムなど)を題材にするのが効果的です。「どんなエンティティが必要か」「どんな関係があるか」を自分で考えてERDを書いてみることで、理解が深まります。試験本番でERDが与えられたときも、まずエンティティ間の関係を整理することから始めましょう。

基本情報技術者試験のデータベース問題攻略!SQLと結合を完全理解

基本情報技術者試験 SQL 結合 JOIN

SELECT文の基本構文:FROM・WHERE・ORDER BYを使いこなす

SQLの最も基本的な構文はSELECT文です。「どのテーブルから(FROM)」「どんな条件で(WHERE)」「どの列を取得するか(SELECT)」という3つの要素で構成されます。試験では、SQL文を読んでその結果を問う問題や、条件に合うSQL文を選ぶ問題が出ます。

SELECT文の基本的な構造は以下のとおりです。SELECT 列名 FROM テーブル名 WHERE 条件 ORDER BY 列名 という形になります。WHEREで行を絞り込み、ORDER BYで並び替え、SELECTで必要な列だけを取得します。

試験でよく問われるSELECT文のポイントは「DISTINCT(重複排除)」「AS(エイリアス)」「BETWEEN(範囲指定)」「LIKE(パターンマッチング)」です。特にLIKEの「%(任意の文字列)」「_(任意の1文字)」のワイルドカードは必ず覚えておきましょう。

句・演算子役割
SELECT取得する列を指定SELECT 名前, 年齢
FROM対象テーブルを指定FROM 社員テーブル
WHERE行の絞り込み条件WHERE 年齢 >= 30
ORDER BY並び替え(ASC/DESC)ORDER BY 年齢 DESC
DISTINCT重複行を排除SELECT DISTINCT 部署名
LIKEパターンマッチングWHERE 名前 LIKE ‘田%’

実際に手を動かしてSQLを書いてみることが、最短の習得方法です。無料で使えるオンラインSQL実行環境(SQLiteOnline、DB Fiddleなど)を活用して、試験の過去問に出てきたSQL文を実際に実行してみましょう。結果を目で見ることで、SQL文の動きが直感的に理解できるようになります。

GROUP BYとHAVING:集計関数との組み合わせをマスターする

GROUP BYは、指定した列の値でレコードをグループ化し、グループごとに集計を行うための句です。集計関数(COUNT・SUM・AVG・MAX・MIN)と組み合わせて使います。たとえば、「部署ごとの社員数を求める」「商品カテゴリごとの売上合計を求める」といった場面で使います。

HAVINGはGROUP BYでグループ化した後に、グループに対して条件を指定する句です。WHEREは行に対する条件ですが、HAVINGはグループに対する条件という点が大きな違いです。試験では「WHEREとHAVINGの違い」が問われることが多いため、この点は確実に理解しておきましょう。

SQL文の実行順序も重要な知識です。FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY という順で処理されます。この順序を知っていると、「なぜWHEREで集計関数が使えないのか(まだGROUP BYが実行されていないから)」という理由が理解でき、混乱せずに済みます。

WHERE vs HAVING の覚え方:「WHERE は個人(行)に、HAVING はグループに条件をつける」と覚えると間違えにくくなります。集計関数(COUNT・SUMなど)を条件にしたいときは必ずHAVINGを使います。

集計関数の使い方もしっかり押さえておきましょう。COUNT(*)は全行数を、COUNT(列名)はNULL以外の行数を数えます。この違いが試験に出ることがあります。また、AVGはNULLを除いた平均値を返す点も覚えておくと、引っかけ問題に対処できます。暗記一覧を活用して、集計関数の特性をまとめて覚えるのも効率的です。

INNER JOINで複数テーブルを結合する方法と注意点

INNER JOIN(内部結合)は、2つのテーブルで結合条件に一致する行だけを取得する結合方法です。両方のテーブルに対応するデータが存在する行のみが結果に含まれます。たとえば、「社員テーブル」と「部署テーブル」を「部署ID」で結合する場合、両方のテーブルに存在する部署IDを持つ社員だけが取得されます。

INNER JOINの構文は「SELECT 列名 FROM テーブルA INNER JOIN テーブルB ON テーブルA.キー = テーブルB.キー」です。「ON」の後に結合条件を書きます。複数のテーブルを結合する場合は、INNER JOINを繰り返し記述します。

注意点として、結合する列名が両テーブルで同じ場合は「テーブル名.列名」という形で修飾する必要があります。また、同じテーブルを2回結合する「自己結合」も試験に出ることがあります。これは「社員テーブルで上司と部下の関係を表現する」といったケースで使われます。

  • INNER JOINは両テーブルに一致するレコードのみ返す
  • ONの後に結合条件を記述する(列名が重複する場合は「テーブル名.列名」で修飾)
  • 複数テーブルはINNER JOINを連ねて結合できる
  • 自己結合は同じテーブルを別名(AS)で区別する

INNER JOINは最もよく使われる結合方法ですが、「一致しないデータを含めたい」場合には外部結合(OUTER JOIN)を使います。どの結合を使うかは、要件によって判断する必要があります。試験では、問題文の条件から「INNER JOINかOUTER JOINか」を選ぶ問題が出るため、両者の違いを明確に理解しておくことが大切です。

OUTER JOIN(外部結合)でNULLを扱う:LEFT・RIGHTの違い

OUTER JOIN(外部結合)は、結合条件に一致しない行も結果に含める結合方法です。一致しない側の列にはNULLが入ります。OUTER JOINには「LEFT OUTER JOIN(左外部結合)」「RIGHT OUTER JOIN(右外部結合)」「FULL OUTER JOIN(完全外部結合)」の3種類があります。

LEFT OUTER JOINは、左側のテーブル(FROM句に書いたテーブル)の全行を残し、右側のテーブルに一致しない行はNULLで埋めます。たとえば、「全社員のリストに部署名を付ける。まだ部署が決まっていない社員も含める」という場合にLEFT OUTER JOINを使います。部署が決まっていない社員の部署名はNULLになります。

RIGHT OUTER JOINはその逆で、右側のテーブルの全行を残します。実務では読みやすさの観点からLEFT OUTER JOINに統一することが多く、試験でもLEFT OUTER JOINの問題が多く出ます。

結合の種類取得するデータNULLが入る場所
INNER JOIN両テーブルで一致する行のみなし
LEFT OUTER JOIN左テーブルの全行+右テーブルの一致行右テーブルの不一致列
RIGHT OUTER JOIN右テーブルの全行+左テーブルの一致行左テーブルの不一致列
FULL OUTER JOIN両テーブルの全行不一致側の列すべて

NULLの扱いはSQLで特に重要です。NULLは「不明・未定義」を表すため、通常の比較演算子(=)ではNULLを検索できません。NULLかどうかを調べるには「IS NULL」「IS NOT NULL」を使います。試験でも「WHERE 列名 = NULL」という誤ったSQL文を正しいSQL文と区別する問題が出ることがあります。

サブクエリ・ビュー・トランザクションの基礎と試験対策

サブクエリ(副問い合わせ)は、SQL文の中に別のSELECT文を入れ子にする技法です。「平均より高い売上の商品を取得する」など、段階的な絞り込みが必要な場合に使います。サブクエリはWHERE句・FROM句・SELECT句の中に書くことができ、それぞれ使い方が異なります。

ビュー(VIEW)は、SELECT文の結果を仮想テーブルとして名前をつけて保存したものです。複雑なSQL文を毎回書かずに済むため、可読性と保守性が上がります。試験では「VIEWを使うメリット」や「VIEWに対してDML(INSERT・UPDATE・DELETE)が使えるか」という問題が出ることがあります。

トランザクションは、複数のSQL操作をひとまとまりとして扱う仕組みです。ACID特性(原子性・一貫性・隔離性・耐久性)は試験の頻出用語です。COMMITで確定、ROLLBACKで取り消しができます。「銀行の振込処理で、引き落としと入金を必ずセットで成功させる」というような場面でトランザクションが活躍します。

注意

ビューに対するINSERT・UPDATE・DELETE(更新操作)は、ビューの定義によっては制限されることがあります。GROUP BYを含むビューや、複数テーブルを結合したビューへの更新は、多くのデータベースで制限されています。試験でも「このビューを更新できるか?」という問いが出ることがあるため、注意しておきましょう。

これらの概念はアルゴリズムと並んで試験の中核をなします。アルゴリズム対策と同様に、データベースも「なぜそうなるか」を理解しながら学ぶことで、初見の問題にも対応できる実力がつきます。データベース全体の知識体系を把握した上で、正規化・SQL・トランザクションの順に学習を進めていくことをおすすめします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次