學習指南 /

關聯資料庫:選教材,先核對查詢在數什麼

查詢能執行,不代表回答正確問題。先命名被計數的實體、連接關係及缺漏值意義;以免費設計教材為主線,再按課程需要加入系統參考或數學理論,不把熟悉語法當作可靠設計。

課程主題: 資料庫系統

學習路線與例題編輯責任: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增補。教材例子不自動代表各現行引擎。

選書前試做

區分房間、預約和標籤,列明鍵與各關係可能產生的資料列數。

檢查標準: 一預約可有多標籤,連接會改變粒度;名稱不能證明一對一。

官方免費閱讀 ↗

書目資訊與取得方式 →

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。

書目資訊與取得方式 →

Foundations of Databases

Serge Abiteboul; Richard Hull; Victor Vianu · 版次: Complete authors’ online draft

形式查詢伴讀

適合何時選擇
已懂關聯設計,想論證約束與表達能力。
何時另選路線
需要初學SQL、產品設定,或把保留重複的SQL視為集合。
建議閱讀範圍
在合法草稿找關聯模型、查詢語言和相依關係,不指定未核實章頁。
限制與取捨
選定作者草稿,不冒稱新核驗紙版。本次端點無法讀取,主線用可存取Watt,先確認自己的合法存取。

選書前試做

把小查詢寫成數學關係,再說明SQL保留相同列時須改的假設。

檢查標準: 區分集合成員和重複次數、NULL和一般值;等價主張須說明語義。

官方免費閱讀 ↗

書目資訊與取得方式 →

檢查先修準備

鍵可說明什麼?

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

LEFT JOIN後COUNT(*)有何陷阱?

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

NULL就是零?

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

六步學習與具體成果

勾選用於自我記錄,並非成績評定;標記不會傳送給本站。

  1. 選擇資料粒度

    建議閱讀範圍: Watt7–10與系統書2章。

    動手產出: 畫三種關係,說明每列意義。

    檢查標準: 房間ID和預約ID不是同一計數單位。

  2. 宣告相依

    建議閱讀範圍: Watt11–12與關聯設計章。

    動手產出: 寫候選鍵、函數相依和分解根據。

    檢查標準: 依據是領域規則,不是三列樣本的巧合。

  3. 預測連接

    建議閱讀範圍: Watt15–16與系統書4.1。

    動手產出: 聚合前列出LEFT JOIN每列。

    檢查標準: 保留C補空列與人數相同但獨立的A預約。

  4. 選分母

    建議閱讀範圍: 系統書3.6–3.7、SQLite參考。

    動手產出: 逐房間解釋三個計數及合計。

    檢查標準: 運算式回答不同問題,執行成功不取代解釋。

  5. 測試倍增

    建議閱讀範圍: 變式和形式伴讀。

    動手產出: 加標籤後追蹤粒度,不消除合法重複值。

    檢查標準: 逐連接核對基數;DISTINCT不是萬用修復。

  6. 寫可重現說明

    建議閱讀範圍: 回到解決弱點的教材。

    動手產出: 保存模式前提、方言、輸入、查詢、輸出和反例。

    檢查標準: 可重現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. 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)。解釋各欄後才稱預約數或總人數。


            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,red)、(1,blue)、(2,red)。聚合前LEFT JOIN標籤後A如何變化?如何保留標籤數卻不改預約度量?

  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可實作明定展示規則,不能發現缺少的測量。

樣本當約束證明

樣本唯一、測試成功,不證明鍵、相依及全部狀態正確性。

進入下一階段之前

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

來源與版次核驗

來源核驗日期:

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

編輯與選書方法 →