# 關聯資料庫：選教材，先核對查詢在數什麼 — 學習任務單

[學習指南](https://unireadinglist.com/zh-tw/guides/relational-databases/)

[課程主題: 資料庫系統](https://unireadinglist.com/zh-tw/subjects/computer-science/#course-databases)

來源核驗日期: 2026-11-04

學習路線與例題編輯責任：University Reading List 編輯專案。

這是大學關聯設計與查詢語義路線，不是正式環境管理指南。程式例用SQLite3，以SQLite3.51.0記憶體資料庫核對。房間與預約資料均虛構；作者草稿只作後續理論讀物，不是現行產品手冊。

## 選擇你的起點

- [ ] 需要免費設計入門
  以Watt/Eng學實體、關係、鍵與正規化，再用小資料核對SQL，明示所用方言。

- [ ] 需要跨課程的系統參考
  用第七版關聯語言與設計打底，再選儲存、交易和處理。

- [ ] 會查詢但想懂形式依據
  離散數學與邏輯之後讀Foundations，研究查詢和約束，不期待最新引擎教程。

## 三本書如何取捨

### Database Design

Adrienne Watt; Nelson Eng · 2 · 2014
免費設計主線

適合何時選擇: 需由實體、相依關係到資料表的清楚導入。
何時另選路線: 想一書涵蓋進階並行、成本最佳化與所有現行方言。
建議閱讀範圍: 第二版第7–12章，再讀15–16章；關係不清楚則回看前面建模章。
限制與取捨: BCcampus確認2014版與SQL增補。教材例子不自動代表各現行引擎。

#### 選書前試做

區分房間、預約和標籤，列明鍵與各關係可能產生的資料列數。
檢查標準: 一預約可有多標籤，連接會改變粒度；名稱不能證明一對一。

你的筆記:

________________________________

[官方免費閱讀](https://opentextbc.ca/dbdesign01/)

[書目資訊與取得方式](https://unireadinglist.com/zh-tw/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/zh-tw/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/zh-tw/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補空列與人數相同但獨立的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；人數NULL表示未知，不是取消或零。本例登記表完整，執行時無變動。保留兩個相同已知值，採SQLite3語義。

你的筆記:

________________________________

## 改變假設，再做一題: 變式：描述資料列重複累計度量

保留預約，加標籤(1,red)、(1,blue)、(2,red)。聚合前LEFT JOIN標籤後A如何變化？如何保留標籤數卻不改預約度量？

你的筆記:

________________________________

## 進入下一階段之前

- 能解釋每欄和資料粒度。
- 能分辨無對應、未知、已測零。
- 能反駁錯誤連接或DISTINCT修復。

## 答案與解釋

### 鍵可說明什麼？

在宣告約束下識別資料列。樣本恰好不同不證明所有允許狀態皆唯一。

### LEFT JOIN後COUNT(\*)有何陷阱？

它也數左側未對應時補出的NULL列。匹配紀錄應數右側非空識別碼。

### NULL就是零？

未知、已測零、根本無預約有別；替換前先寫報告規則。

### 原創SQL例題：沒有對應，不等於值未知

1. A對應兩筆獨立預約，四輸出為2、2、2、4。SUM(DISTINCT seats)為2，錯誤消去合法重複值。
2. B對應預約3，輸出1、1、0、NULL。紀錄存在但人數未知，SUM無非NULL輸入時回傳NULL。
3. C補出一列，輸出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;
```

檢驗結果: 在空SQLite工作階段執行單一敘述。B改為0後已知值數1、合計0、預約數仍1，證明未知不是零。

### 改變假設，再做一題: 變式：描述資料列重複累計度量

1. 預約1出現兩次、預約2一次，A三列，簡單人數和2+2+2=6；實際兩筆預約，人數和4。
2. 先把標籤縮為每預約一列，計數2與1，再與唯一預約連接。A保留預約2、人數4、標籤3。
3. SUM(DISTINCT seats)得2仍錯。先聚合預約後又被多側連接複製，也未修好；最後關係要保持度量粒度。

累計時保持每預約一列，或各算房間級預約與標籤摘要後一對一連接。根據是鍵與基數，不是裝飾性的DISTINCT。

檢驗結果: 列中間資料，核對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補空及處理順序依官方資料核對，不是正式環境管理流程。

這些是本站建議的學習活動，並非大學官方作業，也不代表對每本書逐頁通讀。

[編輯與選書方法](https://unireadinglist.com/zh-tw/editorial/)
