免費開始練習
高考申論題 105年 [資訊處理] 資料庫應用

第 一 題

📖 題組:
考慮以下記載討論版文章的關聯: Member(mId, mName, email) // 會員(編號, 姓名, 電子郵件信箱) Post(pId, mId, dateTime, title, pContent) // 文章(文章 id, 作者編號, 日期時間, 主旨, 內容) Reply(pId, rId, rmId, dateTime, rContent) // 回文(文章 id, 回文 id, 回文作者編號, 日期時間, 內容) 其中主鍵以底線表示,外鍵如下: Post(mId)參考到 Member(mId) Reply(pId)參考到 Post(pId) Reply(rmId)參考到 Member(mId)
📝 此題為申論題,共 4 小題

小題 (一)

列出 2016 年有 PO 過文章(即出現在 Post 關聯裡)的會員之會員編號和姓名。(5 分)

思路引導 VIP

看到此題需先明確查詢目標(Member 表的 mId 與 mName)以及篩選條件(Post 表的 dateTime 在 2016 年)。接著思考需透過 mId 將 Member 與 Post 兩張表串接(或使用子查詢),並務必加上 DISTINCT 去除重複,以免同一人在 2016 年發布多篇文章而重複顯示。

🤖
AI 詳解
AI 專屬家教

【解題思路】利用 Member 與 Post 兩張資料表進行內部連接(INNER JOIN)或子查詢(Subquery),並透過日期函數(EXTRACT)或日期區間設定條件為 2016 年,最後確保查詢結果不重複(DISTINCT)。 【解答】 以下提供兩種符合標準 SQL (ANSI SQL) 語法的常見寫法:

小題 (二)

對於每一篇 PO 文,列出其 pId, PO 文時間,PO 文作者姓名,以及在 2016 年被回應的次數。(8 分)

思路引導 VIP

本題重點在於「對於每一篇 PO 文」皆需列出,即使該文章在 2016 年無回文,其回應次數也應顯示為 0。建議使用 LEFT JOIN 並將年份條件放在 ON 條件中搭配 GROUP BY,或直接使用 SELECT 中的關聯子查詢來達成。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】使用 LEFT JOIN 搭配 GROUP BY,或使用關聯子查詢(Correlated Subquery),確保 2016 年無回應的文章仍能列出且次數為 0。 【解答】 提供兩種標準 SQL 寫法,考生擇一作答即可。

小題 (三)

列出有原作者回應的 PO 文之 pId, title 和作者姓名。(7 分)

思路引導 VIP

解題關鍵在於將「原作者回應」轉化為關聯條件:同一篇文章中,發文者編號(Post.mId)必須與回文者編號(Reply.rmId)相同。可以使用 JOIN 連結 Post、Member 與 Reply 三個資料表,並務必加上 DISTINCT 避免原作者多次回文造成重複顯示;或者使用 EXISTS 子查詢來實作。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】設定文章作者等於回文作者(Post.mId = Reply.rmId),並透過 JOIN 關聯 Member 表取得姓名,同時需注意去除重複紀錄(DISTINCT)。 【解答】 使用標準 SQL 撰寫,提供兩種常見寫法:

小題 (四)

找出 PO 文中(即出現在 Post 關聯裡)的內容有疑似西元日期的文章之 pId, title, PO 文作者姓名。所謂疑似西元日期是指出現連續四個數字,且第一個數字為 1 或 2,或是(連續)數字前有西元或公元的字眼。(10 分)

思路引導 VIP

首先確定需要關聯的資料表為 Post 與 Member,以取得文章及其作者姓名。其次,針對『疑似西元日期』的複雜定義,標準 SQL 的 LIKE 無法精確表達連續數字的條件,需思考使用字串模糊比對(如 T-SQL 的 LIKE 配合字元範圍 [0-9])或正規表示式(SIMILAR TO / REGEXP)來設定 WHERE 條件。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】使用 JOIN 連結實體,並利用正規表示式或支援字元範圍的比對語法進行複雜字串篩選。 【解答】 標準 SQL(SQL:1999 起)對於進階字串比對提供了正規表示式相關支援,實務與考試上可根據 DBMS 採用不同語法。以下提供兩種最常見的撰寫方式:

升級 VIP 解鎖