113 國安局特考三等 資訊組(選試英文) 資料庫應用 考古題詳解
第 一 題20 分
有一連鎖商店使用「訂單資料表」儲存訂單,並將訂單所訂購的產品明細使用「訂單明細資料表」儲存;產品名稱、庫存數量、採購部門等資料則儲存於「產品資料表」。
各資料表的欄位如下:
訂單(訂單編號,商店編號,訂單年,訂單月,訂單金額,付款方式,運送編號)
訂單明細(訂單編號,產品編號,數量,單價,小計)
產品(產品編號,產品名稱,庫存數量,單價,部門)
請使用結構化查詢語言(SQL)的子查詢(Subquery)和內隱聯合查詢(Implicit Join)兩種方式,分別列出 2024 年各部門販售多少種產品。
登入後即可作答並保存紀錄。
核心觀念
本題考查以 SQL 將多張資料表連結,再依部門彙總「2024 年曾販售的產品種類數」。
- 「訂單」記錄訂單年份;「訂單明細」記錄每筆訂單購買的產品;「產品」提供產品所屬部門。
- 透過訂單編號連結「訂單」與「訂單明細」,再透過產品編號連結「訂單明細」與「產品」。
- 「販售多少種產品」是計算不重複的產品數,因此使用
COUNT(DISTINCT 產品編號);同一產品即使出現在多筆訂單或明細中,也只計為一種。 - 依部門分組,使用
GROUP BY 部門。
解題方法一:使用子查詢
先從 2024 年的訂單中找出其訂單明細,再將這些明細與產品資料連結。最後依部門分組,計算不重複的產品編號。
SELECT P.部門,
COUNT(DISTINCT P.產品編號) AS 販售產品種類數
FROM 產品 AS P
JOIN 訂單明細 AS D
ON P.產品編號 = D.產品編號
WHERE D.訂單編號 IN (
SELECT O.訂單編號
FROM 訂單 AS O
WHERE O.訂單年 = 2024
)
GROUP BY P.部門;
子查詢先篩選出 訂單年 = 2024 的訂單編號;外層查詢只保留屬於這些訂單的明細,再連結產品表取得部門。COUNT(DISTINCT P.產品編號) 避免同一產品因多次販售而重複計數。
第 二 題30 分
某一學校有一「實驗室分配資料表」,內含三個欄位,分別為學生學號、實驗室編號和教授姓名。已知學生學號和實驗室編號為主鍵(PK),以底線表示。
實驗室分配資料表(學生學號,實驗室編號,教授姓名)
資料內容如下:
| 學生學號 | 實驗室編號 | 教授姓名 |
|---|---|---|
| 11301 | RM01 | 劉一 |
| 11302 | RM02 | 陳二 |
| 11303 | RM03 | 張三 |
| 11303 | RM04 | 李四 |
| 11304 | RM02 | 陳二 |
| 11305 | RM03 | 張三 |
| 11306 | RM01 | 王五 |
| 11301 | RM02 | 陳二 |
請列出功能相依性(Functional Dependency),並將「實驗室分配資料表」依序轉換成符合 BCNF(Boyce-Codd Normal Form)。正規化後的結果必須標示出必要的主鍵(PK)和外部鍵(FK)。
登入後即可作答並保存紀錄。
核心觀念
本題考查功能相依性(Functional Dependency, FD)與 BCNF 分解。若屬性集合 能唯一決定屬性 ,記為 。BCNF 的條件是:對關係中的每一個非平凡功能相依性 , 都必須是超鍵。
題目已給定「學生學號」與「實驗室編號」為複合主鍵,因此這兩欄合起來才能唯一識別一筆分配紀錄。資料也呈現每個實驗室對應一位教授,例如 RM02 對應陳二;依題意採用此資料語意,可列出「實驗室編號 教授姓名」。
解題方法
令學生學號為 、實驗室編號為 、教授姓名為 。
由題目給定的複合主鍵可得:
由每個實驗室配置一位教授,可得:
因此完整的基本功能相依性為:
其中 也可由 推得;保留它可呈現題目所給主鍵對整筆資料的決定能力。
原表的候選鍵為 。然而在 中, 不是原表的超鍵,且 不屬於候選鍵,因此原表違反 BCNF。
依 BCNF 分解法,將違反 BCNF 的相依性 所涉及的屬性拆出:
- 建立「實驗室資料」,以 為主鍵。
- 建立「學生實驗室分配」,以 為複合主鍵;其中 是參照「實驗室資料」的外部鍵。
正規化結果
第 三 題30 分
下表為 ABC 學校 113 學年第一學期學生修課紀錄表的一部份。經詢問業務承辦人得知,每位學生至少選一門課,每一門課最少需有一人選修。
ABC 學校 113 學年第一學期學生修課紀錄:
| 學號 | 班級 | 姓名 | 課程代號 | 課程名稱 | 課別 | 成績 |
|---|---|---|---|---|---|---|
| 9901001 | 國貿二 | 劉一 | C01 | 國文 | 必修 | 80 |
| 9901001 | 國貿二 | 劉一 | C02 | 英文 | 必修 | 75 |
| 9901002 | 國貿二 | 陳二 | C02 | 英文 | 必修 | 60 |
| 9901002 | 國貿二 | 陳二 | C03 | 會計學 | 必修 | 50 |
| 9901002 | 國貿二 | 陳二 | C04 | 計量經濟 | 選修 | 65 |
| 9901003 | 國貿三 | 張三 | C01 | 國文 | 必修 | 85 |
請使用 1 對多(1:N)關係的烏鴉腳表示法(Crow’s Foot Notation),畫出 ABC 學校 113 學年第一學期學生修課紀錄表的實體關係圖(Entity-Relationship Diagram)。
登入後即可作答並保存紀錄。
核心觀念
本題考查實體關係圖(ERD)中的實體辨識、主鍵選定,以及一對多關係的基數與參與限制。烏鴉腳表示法以「一」端和「多」端標示兩個實體間的關係;題目另提供每位學生至少選一門課、每門課至少有一人選修,表示兩端皆為必須參與。
學生選課紀錄同時包含學生、課程及選課成績。由於一位學生可選多門課、一門課也可由多位學生選修,學生與課程本質上是多對多關係;將其拆成兩個一對多關係時,需以「修課紀錄」作為關聯實體。
解題方法
先從欄位辨識實體及其識別欄位:
- 學生:學號、班級、姓名;以「學號」作為主鍵。
- 課程:課程代號、課程名稱、課別;以「課程代號」作為主鍵。
- 修課紀錄:記錄學生修讀哪門課及其成績。每筆紀錄由「學號」和「課程代號」共同識別,因此兩者組成複合主鍵;同時分別是連結學生、課程的外鍵。「成績」屬於學生修讀特定課程的紀錄,而非學生或課程單獨的屬性。
關係與基數如下:
- 一位學生至少有一筆修課紀錄;每筆修課紀錄只屬於一位學生。因此「學生」到「修課紀錄」為 ,學生端至少參與一次,修課紀錄端恰有一位學生。
- 一門課至少有一筆修課紀錄;每筆修課紀錄只對應一門課。因此「課程」到「修課紀錄」為 ,課程端至少參與一次,修課紀錄端恰對應一門課。
ERD
第 四 題20 分
有一電子商務網站,前端網頁讀入使用者輸入的會員帳號變數為 ,密碼變數為 ,呼叫後端動態網頁程式。
其中會員資料的帳號和密碼存於 資料表,其欄位名稱分別為 和 。
有一使用者在前端表單帳號欄輸入任一字串,密碼欄輸入特定字串。雖然該使用者所輸入的帳號和密碼組合並未儲存於 資料表中,卻可以通過程式檢核而進入會員區。
請問這種對資料庫的入侵行為的攻擊名稱為何?解釋造成此攻擊效果的原因,並說明二種防制的方法。
登入後即可作答並保存紀錄。
核心觀念
本題考查 SQL Injection(SQL 注入):應用程式將未經妥善處理的使用者輸入直接組合進 SQL 指令,使輸入內容被資料庫當成 SQL 語法執行,進而改變原本查詢或驗證的邏輯。
解題方法
判斷關鍵在於:使用者輸入的帳號與密碼組合並未存在於 member 資料表,卻仍通過登入檢核。這表示後端送出的查詢可能被輸入內容改寫,使資料庫回傳「符合登入條件」的結果。
例如,若程式直接以字串串接組成查詢:
SELECT * FROM member
WHERE account = '$acc' AND password = '$pwd';
攻擊者可在輸入欄位填入特製內容,利用引號結束原本的字串,再加入邏輯運算式或 SQL 註解符號,改變 WHERE 條件。若程式只依查詢結果是否有資料判定登入,遭改寫的查詢便可能回傳資料列,讓未登錄的帳密組合通過檢核。