110 地方特考三等 資訊處理 資料庫應用 考古題詳解
第 一 題20 分
給定一個資料表 PersonIncome,其欄位與資料紀錄如下表,ID 是主鍵,name 是員工姓名,paydate 是員工收到工作費的日期,income 是工作費收入金額。此表總共有 筆資料紀錄。請回答下列相關問題:
| ID | name | paydate | income |
|---|---|---|---|
| C1001 | 王大陸 | 2008/02/28 | 25000 |
| C1002 | 李大喬 | 2008/03/12 | 21000 |
| C1003 | 趙麗生 | 2008/04/13 | 27000 |
| C1004 | 黃球聲 | 2008/05/15 | 28000 |
| C1005 | 王大陸 | 2009/06/28 | 27000 |
| C1006 | 李曉喬 | 2009/07/12 | 23000 |
| C1007 | 趙麗生 | 2009/08/13 | 17000 |
| C1008 | 黃球聲 | 2010/09/15 | 25000 |
| C1009 | 王大陸 | 2010/10/28 | 29000 |
| C1010 | 李大喬 | 2010/11/12 | 28000 |
| C1011 | 趙麗生 | 2010/12/13 | 28000 |
| C1012 | 黃球聲 | 2011/01/15 | 27000 |
(一) 請寫出可查出收入金額大於 或小於 的資料紀錄之 SQL 查詢指令。(3 分) (二) 請寫出可查出收入金額為 之倍數的資料紀錄之 SQL 查詢指令。(3 分) (三) 請寫出可查出名字中包含「大」的資料紀錄之 SQL 查詢指令。(2 分) (四) 請寫出可得到每個人個別的平均收入之 SQL 查詢指令。(3 分) (五) 要得到從 2008-05-01 到 2010-12-31 之間每個人個別的收入總額,請寫出對應之 SQL 查詢指令。(4 分) (六) 要查出收入總額大於 的有那些人,請寫出對應之 SQL 查詢指令。(5 分)
登入後即可作答並保存紀錄。
核心觀念
本題綜合考查 SQL 的下列語法:
WHERE:先篩選符合條件的資料列。- 邏輯運算子
AND、OR。 - 餘數函數
MOD:判斷數值是否為某數的倍數。 LIKE:進行字串樣式比對。- 聚合函數
AVG、SUM。 GROUP BY:依姓名分組計算。HAVING:對分組後的聚合結果進行篩選。BETWEEN:判斷日期是否落在包含起、迄日的範圍內。
(一)收入大於 22000 或小於 26000
解題方法
條件為:
SQL 中使用 OR 連接兩個條件。
答案
SELECT *
FROM PersonIncome
WHERE income > 22000
OR income < 26000;
解題技巧
本題條件的涵蓋範圍很大:
- 大於 的資料符合。
- 小於 的資料也符合。
- 只有收入恰為 時不符合。
題目資料中沒有收入 的紀錄,因此查詢結果為全部 筆資料。
(二)收入金額為 7 的倍數
核心觀念
若一個數為 的倍數,除以 的餘數必須為 :
標準 SQL 可使用 MOD(income, 7)。
答案
SELECT *
FROM PersonIncome
WHERE MOD(income, 7) = 0;
符合的收入金額包括:
因此查出的資料為 C1002、C1004、C1010、C1011。
解題技巧
判斷倍數時不要使用除法後的商值,應直接判斷餘數是否為 。部分資料庫可使用 % 表示餘數運算,例如:
WHERE income % 7 = 0
(三)名字中包含「大」
核心觀念
LIKE 用於字串樣式比對:
%代表前後可有任意長度的字串。'%大%'代表字串中任意位置包含「大」。
答案
SELECT *
FROM PersonIncome
WHERE name LIKE '%大%';
符合的姓名為:
- 王大陸
- 李大喬
解題技巧
若要求「開頭為大」,使用 '大%';若要求「結尾為大」,使用 '%大';本題是「包含」,因此使用 '%大%'。
(四)每個人的平均收入
核心觀念
使用 AVG 計算平均值,並以 GROUP BY name 依姓名分組:
答案
SELECT name, AVG(income) AS average_income
FROM PersonIncome
GROUP BY name;
各人的平均收入為:
| name | 平均收入 |
|---|---|
| 王大陸 | 27000 |
| 李大喬 | 24500 |
| 趙麗生 | 24000 |
| 黃球聲 | 26666.67 |
| 李曉喬 | 23000 |
解題技巧
姓名必須出現在 GROUP BY 中,因為查詢同時選取了非聚合欄位 name 與聚合結果 AVG(income)。
「李大喬」與「李曉喬」是不同姓名,不可合併計算。
第 二 題20 分
關於物件導向資料庫,請回答下列問題: (一) 請闡述何謂物件導向資料庫?(3 分) (二) 有些資料類型適合儲存在物件導向資料庫,請舉出三種適合以物件導向資料庫儲存的資料類型。(3 分) (三) 關聯式資料模型有許多構成元素,其中表格(Table)、值組(Row/Tuple)、主鍵(Primary Key)、屬性(Attribute)、預儲程序(Stored Procedure),這些元素可以分別對應到物件導向資料庫的那些元素?(4 分) (四) 物件導向資料庫會運用到類別繼承的設計,請闡述繼承的規則。(5 分) (五) 物件導向資料模型也運用到屬性的概念,分成下列四種:基本屬性(Primitive Attribute)、複合屬性(Complex Attribute)、集合屬性(Set Attribute)、複合集合屬性(Complex Set Attribute)。請闡述這四種屬性的意涵。(5 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查物件導向資料庫(Object-Oriented Database, OODB)的基本定義、適用資料類型、與關聯式資料模型的對應關係、類別繼承規則,以及物件導向資料模型中的屬性分類。
物件導向資料庫的核心精神,是將資料與操作資料的方法封裝在物件中,並以類別、物件識別、封裝、繼承、多型及複合物件等機制,表示現實世界中結構複雜的資料。
(一)物件導向資料庫的意義
物件導向資料庫是以物件導向資料模型為基礎,用來儲存物件及其間關係的資料庫系統。資料庫中的資料不是單純以表格與欄位表示,而是以「物件(Object)」為主要儲存單位。
一個物件通常包含:
- 狀態(State):由物件的屬性或資料成員表示。
- 行為(Behavior):由方法(Method)或操作(Operation)表示。
- 物件識別(Object Identity, OID):每一個物件具有獨立且唯一的識別,不完全依賴物件內容。
- 類別(Class):定義物件所具有的屬性與方法。
- 封裝(Encapsulation):將資料與操作資料的方法整合,並限制外部直接任意修改內部資料。
- 繼承與多型:子類別可以重用父類別的屬性與方法,並依需求重新定義方法。
因此,物件導向資料庫特別適合儲存具有複雜結構、階層關係、繼承關係及大量行為邏輯的資料。
(二)適合以物件導向資料庫儲存的資料類型
適合儲存在物件導向資料庫中的資料,通常具有資料結構複雜、彼此關聯密切、需要直接對應現實世界物件等特性。以下列舉三種:
1. 多媒體資料
例如:
- 影像
- 音訊
- 影片
- 動畫
- 虛擬實境資料
這些資料通常具有大型二進位內容、不同格式及複雜描述資訊,以物件表示較容易保存其內容、格式及播放方法。
2. 電腦輔助設計資料
例如工程圖、建築模型、機械零件模型及三維模型。
一個設計物件可能包含幾何形狀、尺寸、材質、組成零件及設計操作,並具有零件組合及繼承關係,適合使用物件導向資料庫表示。
3. 地理資訊系統資料
例如:
- 道路
- 河流
- 行政區域
- 建築物
- 地形
- 地圖圖層
地理資料常同時包含空間形狀、位置、屬性及彼此拓撲關係,具有複合結構,適合以物件及物件間關係儲存。
其他合理例子包括科學研究資料、工程模擬資料、醫學影像、電信網路模型及文件資料等。
(三)關聯式資料模型與物件導向資料庫的對應
解題方法
可依照「資料結構、資料識別、資料內容及資料操作」四個角度進行對應:
- 關聯式模型的表格是資料的結構單位。
- 值組是表格中的一筆資料。
- 主鍵用來辨識一筆資料。
- 屬性是資料的個別欄位。
- 預儲程序則是對資料執行操作的程序。
對應如下:
| 關聯式資料模型元素 | 物件導向資料庫元素 | 說明 |
|---|---|---|
| 表格(Table) | 類別(Class) | 表格定義資料結構;類別定義物件的屬性與方法 |
| 值組(Row/Tuple) | 物件(Object) | 一個值組代表一筆資料;一個物件代表一個具體實體 |
| 主鍵(Primary Key) | 物件識別(Object Identifier, OID) | 主鍵辨識值組;OID 辨識物件,且通常具有獨立性與唯一性 |
| 屬性(Attribute) | 物件屬性、資料成員(Property/Data Member) | 描述物件的狀態或特徵 |
| 預儲程序(Stored Procedure) | 方法、成員函式(Method/Member Function) | 定義物件可執行的行為與操作 |
重要差異
主鍵通常是由一個或多個屬性值組成,若資料內容改變,主鍵也可能受到影響;物件識別則是系統配置給物件的獨立識別,通常不因物件屬性變更而改變。
因此,不能只將 OID 簡化視為一般主鍵。較完整的說法是:主鍵在概念上可對應物件識別,但 OID 具有更強的物件獨立性。
(四)類別繼承的規則
核心觀念
繼承(Inheritance)是指子類別(Subclass)自動取得父類別(Superclass)所定義的屬性與方法,使類別之間形成階層關係。
其主要規則如下:
1. 子類別繼承父類別的屬性
子類別會取得父類別所定義的資料屬性,並可在此基礎上增加自己的屬性。
例如:
Employee類別具有姓名、員工編號及薪資。Manager為Employee的子類別。Manager自動具有姓名、員工編號及薪資,並可增加部門及管理人數等屬性。
2. 子類別繼承父類別的方法
子類別可以使用父類別所定義的方法,不必重新撰寫相同程式碼,藉此達成程式碼重用。
3. 子類別可以增加新的屬性與方法
繼承並非限制子類別只能使用父類別內容。子類別可以定義父類別沒有的特有功能,以表達更具體的行為。
4. 子類別可以重新定義繼承而來的方法
若父類別的方法不完全符合子類別需求,子類別可以覆寫(Override)該方法,提供自己的實作方式。此規則是多型的重要基礎。
5. 繼承具有傳遞性
若 繼承 ,而 又繼承 ,則 可取得 從 繼承的屬性與方法。形式上可表示為:
第 三 題20 分
資料庫正規化(Normalization)是很重要的資料塑模(Data Modeling)方法,請回答下列相關問題: (一) 請敘述正規化的目的。(3 分) (二) 請敘述第一正規化形式(1NF)的規則,並舉一個不符合 1NF 的資料表示例。(4 分) (三) 請敘述第二正規化形式(2NF)的規則,並舉一個不符合 2NF 的資料表示例。(5 分) (四) 請敘述第三正規化形式(3NF)的規則,並舉一個不符合 3NF 的資料表示例。(4 分) (五) 請敘述 BCNF(Boyce-Codd Normal Form)正規化形式的規則。(4 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查資料庫正規化的階段性規則,以及功能相依(Functional Dependency, FD)與候選鍵(Candidate Key)的判斷。
正規化主要依序處理:
- 1NF:消除重複群組,使欄位值具原子性。
- 2NF:消除非主屬性對複合鍵的部分相依。
- 3NF:消除非主屬性之間的傳遞相依。
- BCNF:要求所有決定因素(Determinant)都必須是超鍵。
相關符號如下:
- : 功能決定 。
- 超鍵(Superkey):可唯一識別資料列的屬性集合。
- 候選鍵:最小的超鍵。
- 主屬性(Prime Attribute):至少出現在一個候選鍵中的屬性。
- 非主屬性(Non-prime Attribute):不屬於任何候選鍵的屬性。
解題方法
判斷各正規化形式時,依下列順序切入:
- 先確認欄位是否為單一、不可再分的值,判斷是否符合 1NF。
- 再觀察候選鍵是否為複合鍵,檢查非主屬性是否只依賴複合鍵的一部分,判斷是否符合 2NF。
- 接著檢查是否存在「鍵決定非主屬性,該非主屬性再決定另一個非主屬性」的傳遞相依,判斷是否符合 3NF。
- 最後針對每一個非平凡功能相依,檢查左側決定因素是否為超鍵,判斷是否符合 BCNF。
(一)正規化的目的
正規化的目的,是透過合理分解資料表與建立適當的功能相依關係,使資料結構更一致、更容易維護,主要包括:
-
減少資料重複與儲存浪費 相同資料不必在多筆資料中重複儲存。
-
避免資料異常(Anomalies) 包括:
- 插入異常(Insertion Anomaly):無法單獨新增某項資料,必須附帶不相關資料。
- 更新異常(Update Anomaly):同一資料儲存多份,修改時容易發生不一致。
- 刪除異常(Deletion Anomaly):刪除某筆資料時,連帶刪除原本仍需保留的資訊。
-
維護資料完整性與一致性 將具有不同意義的資料分開管理,降低資料矛盾的機會。
-
提高資料模型的清晰度與可維護性 使每個資料表集中描述單一主題,方便後續管理與擴充。
正規化並不保證完全消除所有資料重複,也不代表資料表越多越好;實務上仍須配合查詢效能,在必要時進行反正規化(Denormalization)。
(二)第一正規化形式 1NF
1NF 規則
資料表符合 1NF,通常須具備以下條件:
- 每個欄位只能存放一個值。
- 欄位值必須是不可再分的原子值(Atomic Value)。
- 不得在同一欄位中存放多個值、列表或重複群組。
- 每一筆資料列應可被唯一識別,通常會指定主鍵。
重點在於:一個資料格只能對應一個值。
不符合 1NF 的例子
學生資料表:
| 學號 | 姓名 | 電話 |
|---|---|---|
| S001 | 王小明 | 0912-111111、0922-222222 |
「電話」欄位同時存放兩個電話號碼,不是單一原子值,因此不符合 1NF。
可改為:
| 學號 | 姓名 | 電話 |
|---|---|---|
| S001 | 王小明 | 0912-111111 |
| S001 | 王小明 | 0922-222222 |
若以學生與電話的組合識別資料,則可使用 作為候選鍵;也可將電話獨立拆成另一個資料表。
判斷技巧
看到下列形式,通常代表不符合 1NF:
- 「國文、英文、數學」放在同一欄。
- 「0912-111111、0922-222222」放在同一欄。
- 欄位名稱出現「電話1、電話2、電話3」等重複群組。
- 儲存以逗號分隔的清單。
(三)第二正規化形式 2NF
2NF 規則
資料表符合 2NF,必須同時符合:
- 已符合 1NF。
- 每一個非主屬性都必須完全功能相依於每一個候選鍵。
所謂完全功能相依,是指非主屬性依賴整個複合鍵,而不是只依賴複合鍵的一部分。
若候選鍵為 ,且存在:
其中 為非主屬性,則 只依賴複合鍵的一部分 ,稱為部分功能相依(Partial Functional Dependency),因此不符合 2NF。
若候選鍵是單一屬性,則不會發生部分相依問題;只要符合 1NF,通常即可符合 2NF。
不符合 2NF 的例子
選課資料表:
| 學號 | 課號 | 學生姓名 | 課程名稱 | 成績 |
|---|---|---|---|---|
| S001 | C101 | 王小明 | 資料庫 | 85 |
| S001 | C102 | 王小明 | 作業系統 | 90 |
假設一名學生可以修習多門課,一門課也可以由多名學生修習,因此候選鍵為:
功能相依關係為:
其中:
- 「學生姓名」只依賴「學號」。
- 「課程名稱」只依賴「課號」。
- 「成績」才依賴完整的 。
因此,「學生姓名」與「課程名稱」對複合鍵產生部分相依,資料表不符合 2NF。
分解方式
可分解為三個資料表:
學生表:
| 學號 | 學生姓名 |
|---|---|
| S001 | 王小明 |
課程表:
| 課號 | 課程名稱 |
|---|---|
| C101 | 資料庫 |
| C102 | 作業系統 |
選課表:
第 四 題20 分
在多使用者多工的資料庫管理系統(Database Management System),多個交易(Transactions)在同步執行(Concurrently Performed)時,有可能發生資料讀取之難題(issue)。請回答下列相關問題: (一) 請敘述何謂交易?(4 分) (二) 請敘述何謂更新遺失(Lost Updates)的難題?(4 分) (三) 請敘述何謂讀到髒資料(Dirty Read)的難題?(4 分) (四) 請敘述何謂無法重複讀取(Non-Repeatable Read)難題?(4 分) (五) 同步控制方法(Concurrency Control Method)可用來解決前述的難題。其中有一種以鎖為基礎之協定(Lock-Based Protocol),請敘述其運作機制。(4 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查資料庫交易的基本概念,以及多交易同步執行時的三種典型資料異常:
- 更新遺失(Lost Update)
- 讀到髒資料(Dirty Read)
- 無法重複讀取(Non-Repeatable Read)
解決方法以同步控制(Concurrency Control)為核心,常見作法包括鎖定協定(Lock-Based Protocol)。其目的在於維持交易的隔離性(Isolation),使同步執行的結果等價於某種交易循序執行的結果,亦即具備可串行化(Serializability)。
解題方法
本題各小題可依下列方式作答:
- 先定義交易及其基本特性。
- 再以兩個交易交錯執行的時間順序,說明各種資料異常如何發生。
- 最後說明共享鎖、排他鎖與兩階段鎖定協定如何避免衝突。
(一)何謂交易?(4 分)
交易(Transaction)是資料庫中一組具有完整邏輯意義的操作單位,通常包含一個或多個讀取、寫入、更新或刪除資料的動作。
交易必須具備「全有或全無」的特性:
- 交易成功完成時,所有操作均生效,並以
COMMIT確認。 - 交易執行失敗或發生錯誤時,所有已完成的操作均應取消,並以
ROLLBACK回復至交易開始前的狀態。
交易通常以 ACID 四項特性描述:
- 原子性(Atomicity):交易內的操作不可分割,全部成功或全部失敗。
- 一致性(Consistency):交易執行前後,資料庫均須符合完整性限制。
- 隔離性(Isolation):多個交易同步執行時,彼此不應產生不當干擾。
- 持久性(Durability):交易一旦提交,結果即使發生系統故障仍應保留。
因此,交易可視為資料庫中一個完整且可復原的工作單位。
(二)更新遺失(Lost Updates)難題(4 分)
更新遺失是指兩個交易同時讀取同一筆資料,之後各自進行更新,後執行的更新覆蓋先前的更新,導致先前交易的結果遺失。
例如資料項目 原值為 :
| 執行順序 | 交易 | 交易 |
|---|---|---|
| 1 | 讀取 | |
| 2 | 讀取 | |
| 3 | 將 更新為 | |
| 4 | 將 更新為 |
最後資料庫中的 ,交易 所做的更新 被交易 覆蓋,因此 的更新遺失。
若兩個交易實際上分別增加 與 ,合理結果應為:
但因兩交易均根據舊值 計算,最後只留下 ,這就是更新遺失。
判斷重點
只要出現下列情形,即屬於更新遺失:
- 多個交易讀取同一筆資料。
- 多個交易均進行寫入或更新。
- 後寫入的交易覆蓋先前交易的結果。
(三)讀到髒資料(Dirty Read)難題(4 分)
讀到髒資料是指某交易讀取了另一交易尚未提交的資料,而該筆資料後來因另一交易回復或失敗而被取消,造成前一交易使用了實際上不存在的資料。
例如資料項目 原值為 :
| 執行順序 | 交易 | 交易 |
|---|---|---|
| 1 | 將 更新為 | |
| 2 | 讀取 | |
| 3 | 發生錯誤,執行 ROLLBACK | |
| 4 | 回復為 |
交易 讀到的 是交易 尚未提交的暫時結果。由於 最後回復, 並未正式存在於資料庫中,因此 讀到的是髒資料。
可能造成的問題
- 後續計算使用錯誤資料。
- 產生報表或決策結果不正確。
- 交易之間形成不一致的依賴關係。
判斷重點
「髒」的關鍵在於資料來源交易尚未 COMMIT。只要讀取未提交資料,即有 Dirty Read 問題。
(四)無法重複讀取(Non-Repeatable Read)難題(4 分)
無法重複讀取是指同一交易在不同時間對同一筆資料進行兩次讀取,兩次讀得的結果不同,原因是另一交易在兩次讀取之間已更新並提交該筆資料。
例如資料項目 原值為 :
第 五 題20 分
資料庫領域有許多專門術語,請敘述下列術語之意涵: (一) 參與限制(Participation Constraint)(4 分) (二) 基數限制(Cardinality Constraint)(4 分) (三) View(4 分) (四) 外來鍵(Foreign Key)(4 分) (五) 叢集索引(Clustered Index)(4 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查資料庫設計與實作中的五個基本術語:
- ER 模型中的參與限制與基數限制
- 關聯式資料庫中的 View 與外來鍵
- 資料庫索引中的叢集索引
作答時應先寫出正式定義,再補充其功能、限制及簡單例子,才能完整取得各小題分數。
解題方法
(一) 參與限制(Participation Constraint)
參與限制用來表示:某一實體集合中的實體,是否「必須」參與某一關係集合。
可分為兩類:
- 全部參與(Total Participation)
實體集合中的每一個實體,都必須至少參與一次該關係。
例如:
- 每一位員工都必須隸屬於某一個部門。
- 員工實體集合對「隸屬」關係具有全部參與限制。
在 ER 圖中,通常以實體集合與關係集合之間的雙線表示。
- 部分參與(Partial Participation)
實體集合中的實體不一定要參與該關係,只有部分實體參與即可。
例如:
- 部分員工可能尚未參加任何專案。
- 員工實體集合對「參與專案」關係即可能是部分參與。
在 ER 圖中,通常以單線表示。
參與限制主要描述參與的「最低數量」:
- 全部參與:最低參與數為
- 部分參與:最低參與數為
因此,參與限制可用最小基數表示為:
(二) 基數限制(Cardinality Constraint)
基數限制用來表示:一個實體透過某一關係,最多可以與另一個實體集合中的多少個實體發生關聯。
常見類型如下:
- 一對一(1:1)
一個部門最多由一位主管管理,一位主管最多管理一個部門。
- 一對多(1:N)
一個部門可以有許多員工,但一位員工只隸屬於一個部門。
- 多對一(N:1)
許多員工隸屬於同一個部門。
- 多對多(M:N)
一位學生可以修習多門課程,一門課程也可以由多位學生修習。
基數限制主要描述參與的「最大數量」:
- :最多只能對應一個實體
- 或 :最多可對應多個實體
若以最小、最大基數表示,常見形式包括:
- :可不參與,最多對應一個
- :必須參與,且只能對應一個
- :可不參與,最多對應多個
- :至少對應一個,且可對應多個
參與限制與基數限制的差異是:
| 項目 | 主要回答的問題 |
|---|---|
| 參與限制 | 實體是否必須參與關係? |
| 基數限制 | 實體最多可與多少個其他實體建立關係? |
因此,參與限制偏重「最低參與要求」,基數限制偏重「最高對應數量」。
(三) View
View 是由一個查詢結果所定義的虛擬關聯表,通常稱為「檢視表」或「視觀表」。
View 本身通常不直接儲存完整資料,而是儲存其定義;使用者查詢 View 時,資料庫管理系統會依照定義,從基礎表格產生查詢結果。
例如:
View 的主要功能如下:
- 簡化複雜查詢
將多表連結、篩選及彙總查詢包裝成一個虛擬表格,使用者不必每次重寫複雜 SQL。
- 提高資料安全性
只公開特定欄位或特定資料列,例如只顯示員工編號與姓名,不公開薪資欄位。
- 提供邏輯資料獨立性
基礎表格的結構變更時,只要 View 的介面維持不變,應用程式可減少修改。
- 提供不同使用者的資料觀點
不同部門可依權限使用不同 View,取得適合自身業務的資料內容。
View 的限制包括:
- View 通常沒有獨立的實體資料儲存空間。
- 具有聚合函數、
GROUP BY、DISTINCT、複雜連結或計算欄位的 View,可能無法直接更新。 - View 的資料內容會隨基礎表格資料變動而改變。
(四) 外來鍵(Foreign Key)
外來鍵是關聯式資料表中的一個欄位或一組欄位,其值用來參照另一個資料表的主鍵,或具有唯一性的候選鍵。
例如: