普考申論題
105年
[資訊處理] 資料處理概要
第 二 題
📖 題組:
一關聯式資料庫之綱要(relational database schema)如下: 產品(編號,名稱,價格) 客戶(身分證號,姓名,地址,年齡) 購買(身分證號,編號,數量)
一關聯式資料庫之綱要(relational database schema)如下: 產品(編號,名稱,價格) 客戶(身分證號,姓名,地址,年齡) 購買(身分證號,編號,數量)
📝 此題為申論題,共 2 小題
小題 (二)
今欲查出所有沒有購買任何產品之客戶身分證號和姓名,某位資料庫管理員所寫下的 SQL 指令如下:
SELECT 身分證號,姓名
FROM 客戶,購買
WHERE 客戶.身分證號 ≠ 購買.身分證號;
請問他的寫法是否正確?若不正確,請說明錯處,並寫出正確的 SQL 查詢。(15 分)
SELECT 身分證號,姓名
FROM 客戶,購買
WHERE 客戶.身分證號 ≠ 購買.身分證號;
請問他的寫法是否正確?若不正確,請說明錯處,並寫出正確的 SQL 查詢。(15 分)
思路引導 VIP
本題考查關聯式資料庫中典型的「差集(Set Difference)」運算觀念。看到「查詢沒有發生某事(如沒有購買)」的排除性條件時,考生應直覺聯想到 NOT IN、NOT EXISTS 或是 LEFT JOIN ... IS NULL 等語法,並須立刻察覺原題目指令中跨資料表直接使用「不等於(≠)」會引發笛卡兒乘積(Cartesian Product)的邏輯陷阱。
小題 (一)
請用 SQL 指令來查出所有購買產品的客戶中,年齡小於 15 歲的客戶所購買的產品名稱、數量和這些客戶的姓名。(10 分)
思路引導 VIP
看到跨資料表查詢題目,首先應盤點所需欄位(名稱、數量、姓名)並確認其所屬的資料表。接著,找出資料表間的關聯鍵(身分證號、編號)進行內部合併(INNER JOIN),最後套用題目要求的選擇條件(年齡 < 15),即可建構出具備嚴謹邏輯的 SQL 語法。