# 関係データベース：教材を選び、集計の単位を確かめる — 学習ワークシート

[学習ガイド](https://unireadinglist.com/ja/guides/relational-databases/)

[科目・テーマ: データベース](https://unireadinglist.com/ja/subjects/computer-science/#course-databases)

出典確認日: 2026-11-04

学習順路・例題の編集責任：University Reading List編集プロジェクト。

関係設計と問い合わせの意味を学ぶ学部向け順路で、本番管理手順ではありません。例はSQLite3を用い、SQLite3.51.0のメモリー内データベースで確認しました。全行は創作です。著者公開草稿は後の理論用で、初学者用SQLマニュアルではありません。

## 出発点を選ぶ

- [ ] 無料で設計を始めたい
  Watt/Engで実体、関係、キーと正規化を学び、小さいデータでSQLを確認します。方言を明記します。

- [ ] システム全体の参照書が必要
  第七版の関係言語と設計から入り、保存、処理、トランザクションを後に選びます。

- [ ] 問い合わせの形式的根拠を知りたい
  離散数学と論理の後にFoundationsを使います。現行製品の操作説明とは目的が違います。

## 三冊を比較する

### Database Design

Adrienne Watt; Nelson Eng · 2 · 2014
無料の設計主教材

選ぶ場面: 実体から依存関係と表への読みやすい順路が必要。
別の教材が適する場面: 高度な同時実行や全SQL方言を一冊に求める場合。
読む範囲: 第二版7–12章、次に15–16章。実体の区別が曖昧なら前のモデル章へ。
限界と注意点: BCcampusの2014年版とSQL追加を確認。例の慣習を全現行エンジンへ移せません。

#### 選ぶ前に試す

部屋、予約、タグのキーと関係ごとの生成行数を指定します。
確認すること: 一予約に複数タグが付くなら結合で粒度が変わります。名前だけで一対一とは言えません。

自分のメモ:

________________________________

[公式の無料教材](https://opentextbc.ca/dbdesign01/)

[書誌情報と入手方法](https://unireadinglist.com/ja/subjects/computer-science/database-design-watt-eng/)

### Database System Concepts（データベースシステム概論）

Abraham Silberschatz; Henry F. Korth; S. Sudarshan · 7 · 2019
関係言語とシステムの参照

選ぶ場面: 設計だけでなく問い合わせやトランザクションも授業で扱う場合。
別の教材が適する場面: 短い設計導入だけが必要、または公開付録が全本文だと思う場合。
読む範囲: 第七版2–4、6–7章。関係モデルの後に17章のトランザクション。
限界と注意点: 著者は2019年3月とISBN9780078022159を確認。公開目次・スライドと本文利用権は別です。

#### 選ぶ前に試す

3.6–3.7と4.1の後、例の三種類のCOUNTとSUMを先に予測します。
確認すること: 予約がない部屋と、人数が不明な予約は、SUMがどちらもNULLでも違います。

自分のメモ:

________________________________

ISBN: 9780078022159

[書誌情報と入手方法](https://unireadinglist.com/ja/subjects/computer-science/database-system-concepts/)

### Foundations of Databases

Serge Abiteboul; Richard Hull; Victor Vianu · Complete authors’ online draft
形式的問い合わせの伴読

選ぶ場面: 関係設計を理解し、表現力や依存関係を論証したい場合。
別の教材が適する場面: 最初のSQL、製品設定、重複保持SQLと集合の無条件同一視が必要な場合。
読む範囲: 公開草稿の関係モデル・問い合わせ・依存関係を探します。未確認の現行章番号は指定しません。
限界と注意点: 選定対象は著者草稿で、新しい紙版を確認したわけではありません。今回の接続は失敗したため、実際の利用可否を確認し、主線にはアクセス可能なWattを使います。

#### 選ぶ前に試す

小さい問い合わせを集合で表し、SQLが同じ行を残す場合に何が変わるか書きます。
確認すること: 集合の所属と重複度、NULLと普通の値を区別します。同値の主張には意味論の前提が必要です。

自分のメモ:

________________________________

[公式の無料教材](https://webdam.di.ens.fr/Alice/)

[書誌情報と入手方法](https://unireadinglist.com/ja/subjects/computer-science/foundations-databases-abiteboul-hull-vianu/)

## 準備を確認する

### キーは何を示す？

自分のメモ:

________________________________

### LEFT JOIN後のCOUNT(\*)は？

自分のメモ:

________________________________

### NULLはゼロ？

自分のメモ:

________________________________

## 成果物を作る六つの段階

- [ ] 行の単位を選ぶ

読む範囲: Watt7–10、システム書2章。

作るもの: 部屋・予約・タグを描き一行の意味を記述。

確認すること: 部屋IDと予約IDは同じ計数単位ではありません。

自分のメモ:

________________________________

- [ ] 依存関係を宣言

読む範囲: Watt11–12と関係設計章。

作るもの: キー、関数従属性、分解の根拠を小さな台帳で書く。

確認すること: 三行の偶然ではなく、強制する領域規則を述べます。

自分のメモ:

________________________________

- [ ] 結合を予測

読む範囲: Watt15–16、システム書4.1。

作るもの: 集計前のLEFT JOIN全行を手書き。

確認すること: CのNULL拡張行と、同じ人数でも別のA予約を残します。

自分のメモ:

________________________________

- [ ] 分母を選ぶ

読む範囲: システム書3.6–3.7、SQLite参照。

作るもの: 部屋別に三つの個数と合計を解釈。

確認すること: 数え方ごとに別の問いがあり、実行成功は説明を代替しません。

自分のメモ:

________________________________

- [ ] 重複度を調べる

読む範囲: 追加問題と理論伴読。

作るもの: タグ結合後の粒度を追い、正当な同値を消さず修復。

確認すること: 各結合の行数を確認。DISTINCTは一般的修復法ではありません。

自分のメモ:

________________________________

- [ ] 再現可能なメモ

読む範囲: 弱点を補う教材に戻る。

作るもの: スキーマ前提、方言、入力、問い合わせ、出力、反例を保存。

確認すること: NULLと重複が再現できても同時実行・速度は別の主張です。

自分のメモ:

________________________________

## 解答付きの例題: 創作SQL例：未対応と未知の値は違う

部屋はA,B,C。予約(id,room,seats)は(1,A,2),(2,A,2),(3,B,NULL)、Cは予約なし。LEFT JOIN後のCOUNT(\*)、COUNT(booking.id)、COUNT(booking.seats)、SUM(booking.seats)を部屋別に求めます。

前提: 予約IDは一意で非NULL。seatsのNULLは人数不明で、取消やゼロではありません。台帳はこの例で完全、実行中の変更なし。Aの等しい二値を保持し、SQLite3の意味論を使います。

自分のメモ:

________________________________

## 前提を変えて考える: 追加問題：説明行が測定値を増やす

同じ予約へタグ(1,red),(1,blue),(2,red)を追加。集計前にLEFT JOINするとAはどうなり、予約の測定を保ったままタグ数を付けるには？

自分のメモ:

________________________________

## 次に進む前に

- 全出力列と行粒度を説明できる。
- 未対応、欠測、測定ゼロを区別できる。
- 誤った結合やDISTINCT修復への反例を作れる。

## 解答と解釈

### キーは何を示す？

宣言した制約の下で行を識別します。標本で値が違うだけでは全許可状態のキーを証明しません。

### LEFT JOIN後のCOUNT(\*)は？

未対応の左行に作るNULL拡張行も数えます。対応記録なら非NULLの右側IDを数えます。

### NULLはゼロ？

欠測と値ゼロ、予約関係の不存在は別です。置換前に出力規則を明記します。

### 創作SQL例：未対応と未知の値は違う

1. Aは二予約に対応し、四出力は2,2,2,4。SUM(DISTINCT seats)は2となり、正当な繰り返しを消します。
2. Bは予約3に対応し1,1,0,NULL。予約は存在しても既知の人数がなく、SUMは非NULL入力がないためNULLです。
3. CにはNULL拡張行一つが作られ1,0,0,NULL。COUNT(\*)の1は予約数ではありません。
4. 無予約をゼロ表示する規則を採るとしても、すべてのNULL合計をゼロにすればBの未知を偽の測定にします。

指定順でA:(2,2,2,4)、B:(1,1,0,NULL)、C:(1,0,0,NULL)。列の意味を説明してから予約数・人数と呼びます。

## 創作SQL例：未対応と未知の値は違う — sql

```sql
WITH room(room_id) AS (VALUES ('A'), ('B'), ('C')),
booking(id, room_id, seats) AS (
  VALUES (1, 'A', 2), (2, 'A', 2), (3, 'B', NULL)
)
SELECT r.room_id, COUNT(*) AS joined_rows,
       COUNT(b.id) AS bookings, COUNT(b.seats) AS known_counts,
       SUM(b.seats) AS seats
FROM room AS r
LEFT JOIN booking AS b ON b.room_id = r.room_id
GROUP BY r.room_id
ORDER BY r.room_id;
```

結果を検証する: 単一SQL文を空のSQLiteセッションで実行。BをNULLから0に変えると既知数1、合計0、予約数1。未知とゼロの差を確認します。

### 前提を変えて考える: 追加問題：説明行が測定値を増やす

1. 予約1が二行、予約2が一行で、Aの結合行3、単純合計2+2+2=6。予約自体は二件、既知人数は4です。
2. タグを予約別一行へまとめ、件数2と1を作ってから一意の予約へ結合。Aの予約2、人数4、タグ3を保ちます。
3. SUM(DISTINCT seats)は2で誤り。予約を先に集約しても、後の多側結合が再複製すれば直りません。

予約の測定を足す時に一予約一行を保つか、部屋別の予約・タグ集計を別々に作り一対一で結合します。

結果を検証する: 中間行を示してAの2/4/3を確認。タグはBの欠測人数を測ったことにはなりません。

## よくある誤り

### 行と実体の混同

結合行は自動的に顧客・予約・部屋一件ではありません。先に粒度を決めます。

### 規則なしのNULL置換

COALESCEは明示した表示規則を実装できますが、欠けた測定を発見できません。

### 標本を制約の証明とする

標本の一意性や成功した実行だけではキー・依存関係・全状態での正しさは証明できません。

## 出典と版の確認

- [BCcampus: Database Design second-edition contents and access](https://opentextbc.ca/dbdesign01/)
  2014年第二版、章と公式無料入口を確認。課題は本サイト独自です。

- [Authors: Database System Concepts, seventh-edition identity](https://www.db-book.com/)
  著者が第七版、2019年、ISBNを確認。公開付録を全本文と呼びません。

- [Authors: seventh-edition contents](https://www.db-book.com/toc-dir/toc.pdf)
  関係言語、設計、トランザクションの章を著者目次で確認。

- [Authors: Foundations of Databases online draft](https://webdam.di.ens.fr/Alice/)
  既存の著者草稿という識別を保持。接続失敗から新年・紙ISBN・再利用許可を推測しません。

- [SQLite: built-in aggregate semantics](https://www.sqlite.org/lang_aggfunc.html)
  COUNTとSUM/NULLは公式仕様で確認。

- [SQLite: SELECT and join processing](https://www.sqlite.org/lang_select.html)
  LEFT JOINのNULL拡張は公式SELECT資料で確認。本番操作手順ではありません。

提案する学習活動であり、公式の課題や全巻通読の主張ではありません。

[編集と選定の方法](https://unireadinglist.com/ja/editorial/)
