關聯資料庫:選教材,先核對查詢在數什麼
查詢能執行,不代表回答正確問題。先命名被計數的實體、連接關係及缺漏值意義;以免費設計教材為主線,再按課程需要加入系統參考或數學理論,不把熟悉語法當作可靠設計。
學習路線與例題編輯責任:University Reading List 編輯專案。 編輯與選書方法 · 來源核驗日期:
適用範圍與編輯責任
這是大學關聯設計與查詢語義路線,不是正式環境管理指南。程式例用SQLite3,以SQLite3.51.0記憶體資料庫核對。房間與預約資料均虛構;作者草稿只作後續理論讀物,不是現行產品手冊。
選擇你的起點
三本書如何取捨
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就是零?
未知、已測零、根本無預約有別;替換前先寫報告規則。
六步學習與具體成果
已標記完成的成果: 0 / 6
勾選用於自我記錄,並非成績評定;標記不會傳送給本站。
-
選擇資料粒度
建議閱讀範圍: 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語義。
- A對應兩筆獨立預約,四輸出為2、2、2、4。SUM(DISTINCT seats)為2,錯誤消去合法重複值。
- B對應預約3,輸出1、1、0、NULL。紀錄存在但人數未知,SUM無非NULL輸入時回傳NULL。
- C補出一列,輸出1、0、0、NULL。COUNT(*)為1,對應預約數卻為零。
- 可明定無預約顯示零,但將所有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出現兩次、預約2一次,A三列,簡單人數和2+2+2=6;實際兩筆預約,人數和4。
- 先把標籤縮為每預約一列,計數2與1,再與唯一預約連接。A保留預約2、人數4、標籤3。
- SUM(DISTINCT seats)得2仍錯。先聚合預約後又被多側連接複製,也未修好;最後關係要保持度量粒度。
答案與解釋
累計時保持每預約一列,或各算房間級預約與標籤摘要後一對一連接。根據是鍵與基數,不是裝飾性的DISTINCT。
檢驗結果
列中間資料,核對A的2/4/3。標籤沒有替B新增人數測量,未知仍未知。
常見誤區
資料列等於實體
連接列不自動等於一顧客、一預約或一房間,先定義粒度。
無規則就替換NULL
COALESCE可實作明定展示規則,不能發現缺少的測量。
樣本當約束證明
樣本唯一、測試成功,不證明鍵、相依及全部狀態正確性。
進入下一階段之前
- 能解釋每欄和資料粒度。
- 能分辨無對應、未知、已測零。
- 能反駁錯誤連接或DISTINCT修復。
來源與版次核驗
來源核驗日期:
- BCcampus: Database Design second-edition contents and access
確認2014第二版、章序和官方免費入口;任務為本站原創。
- Authors: Database System Concepts, seventh-edition identity
著者確認第七版、2019和ISBN;公開配套不是全書。
- Authors: seventh-edition contents
著者目錄核實查詢、設計和交易章目。
- Authors: Foundations of Databases online draft
保留作者草稿身分;存取失敗不能用來猜新年份、紙ISBN或再用許可。
- SQLite: built-in aggregate semantics
COUNT與SUM/NULL依官方參考核對。
- SQLite: SELECT and join processing
LEFT JOIN補空及處理順序依官方資料核對,不是正式環境管理流程。
這些是本站建議的學習活動,並非大學官方作業,也不代表對每本書逐頁通讀。