111年國家安全情報人員三等資料庫應用
一、一篇學術文章通常有許多屬性,包括唯一編號 (paper_ID)、論文名稱 (title)、發表期刊 (journal)、發表卷期 (vol)、發表年 (year)、起始頁 (start) 及結束頁(end),若可對應到先前提出過的一或多篇技術報告,則另加上該技術報告編號 (TR-ID)。每一本期刊一年可出刊多次,每次都有不同的卷期 (連續但不重複),且視論文長短,結束頁一定不會小於起始頁,且不會把兩篇論文(部分) 內容編排在同一頁。請用以下關連及資料表回答問題。 Paper (ID, title, journal, vol, year, start, end, TR-ID) (四)下列那幾個是正確的 SQL 語法?(5分) 1.SELECT * FROM Paper WHERE end-start > 10; 2.SELECT * FROM Paper WHERE end-start < 0; 3.SELECT SUM(title) FROM Paper; 4.SELECT year, COUNT(*) FROM Paper GROUP BY year; 5.SELECT year, COUNT(*) FROM Paper ORDER BY year; (五)下列 SQL 語法執行後會產生幾行 (tuples) 的資料?(5分) 1.SELECT paper_ID FROM Paper WHERE year <= 2022; 2.SELECT DISTINCT paper_ID FROM Paper WHERE year <= 2022; 3.SELECT AVG(year) FROM Paper GROUP BY journal; 4.SELECT * FROM Paper WHERE journal LIKE '%t'; 5.SELECT title FROM Paper ORDER BY year; |
答:
Paper資料表:
paper_ID |
title |
journal |
vol |
year |
start |
end |
TR-ID |
142 |
Dynamic Prog. |
Algo |
41 |
2017 |
34 |
34 |
104 |
524 |
Mysql DB |
JDB |
56 |
2022 |
26 |
41 |
723 |
524 |
Mysql DB |
JDB |
56 |
2022 |
26 |
41 |
724 |
103 |
Sorting |
Algo |
32 |
2015 |
15 |
25 |
142 |
712 |
Dynamic Prog. |
Algo |
01 |
2022 |
1 |
50 |
156 |
301 |
Hashing |
Algo |
01 |
2022 |
51 |
52 |
110 |
199 |
Mysql DB |
JDB |
67 |
2022 |
71 |
101 |
511 |
87 |
Queue |
DataStruct |
32 |
2021 |
27 |
28 |
110 |
65 |
Stack |
DataStruct |
03 |
2020 |
49 |
56 |
110 |
說明:
1.如果欄位有技術報告編號 (TR-ID),則表示該論文有參考到其他論文。
2.技術報告編號 (TR-ID) 本身應該是多值屬性,這樣才能參考到多篇論文。
3.唯一編號 (paper_ID) 和技術報告編號 (TR-ID) 是相同的欄位。
4.題目本身出錯,無法設定主鍵,修正如上 (紅色字)。
(一)下列屬性那幾個可以是主鍵?
1.{paper_ID}:主鍵不可能出現重複值 (如524),所以不是主鍵。
2.{paper_ID, TR-ID}:
主鍵符合以下條件:
(1)滿足唯一性及最小性。
(2)所有主鍵中的屬性皆不可為空值。
因此是主鍵。
3.{paper_ID, title, TR-ID}:滿足唯一性,但是不符合最小性,所以不是主鍵。
4.{title, year}:出現重複值 (如 MysqlDB, JDB 這組),所以不是主鍵。
5.{start, journal, issue}:沒有 issue 欄位,所以不是主鍵。
(二)下列那幾個存在功能相依性?
1.paper_ID→title。
3.{journal, vol}→year。
4.paper_ID→{start, end, journal, vol}。
(三)進行BCNF正規化,並寫出正規化後的關連
1.第一正規化:
紀錄中的每個欄位值皆為基元值 (Atomic value)。即不存在複合屬性 (composite attributes)、多值屬性 (multi-valued attributes)。所以 R(ID, title, journal, vol, year, start, end, TR-ID) 符合 1NF。主鍵為 {paper_ID, TR-ID},外鍵沒有。
2.第二正規化:
{paper_ID, TR-ID} 為主鍵。{title, journal, vol, year, start, end} 部份功能相依於主鍵 {paper_ID, TR-ID} 中的 paper_ID。因此不符合第二正規化,拆解如下:
(1)R1(paper_ID, TR-ID):
主鍵:{paper_ID, TR-ID},外鍵:paper_ID→R2.paper_ID。
(2)R2(paper_ID, title, journal, vol, year, start, end)。主鍵:paper_ID,外鍵:無。
3.第三正規化:
R2(paper_ID, title, journal, vol, year, start, end):
因為 paper_ID→{journal, vol} 且 {journal, vol}→year,year 遞移相依於主鍵 paper_ID,因此不符合第三正規化,拆解如下:
(1)R21(paper_ID, title, journal, vol, start, end):
主鍵:paper_ID,外鍵:{journal, vol}→R22.{journal, vol}。
(2)R22(journal, vol, year)。主鍵:{journal, vol},外鍵:無。
4.BCNF正規化:
R1、R21、R22 的決定因素是此關聯的候選鍵,所以都符合 BCNF。
5.正規化處理的結果:
(1)R1(paper_ID, TR-ID):
主鍵:{paper_ID, TR-ID},外鍵:paper_ID→R21.paper_ID。
(2)R21(paper_ID, title, journal, vol, start, end):
主鍵:paper_ID,外鍵:{journal, vol}→R22.{journal, vol}。
(3)R22(journal, vol, year)。主鍵:{journal, vol},外鍵:無。
(四)下列那幾個是正確的SQL語法?
1.SELECT * FROM Paper WHERE end-start > 10;
(1)正確的 SQL 語法。
(2)執行結果:
paper_ID |
title |
journal |
vol |
year |
start |
end |
TR-ID |
199 |
Mysql DB |
JDB |
67 |
2022 |
71 |
101 |
511 |
524 |
Mysql DB |
JDB |
56 |
2022 |
26 |
41 |
723 |
524 |
Mysql DB |
JDB |
56 |
2022 |
26 |
41 |
724 |
712 |
Dynamic Prog. |
Algo |
01 |
2022 |
1 |
50 |
156 |
2.SELECT * FROM Paper WHERE end-start < 0;
(1)正確的 SQL 語法。
(2)執行結果:
paper_ID |
title |
journal |
vol |
year |
start |
end |
TR-ID |
3.SELECT SUM(title) FROM Paper;
(1)錯誤的 SQL 語法。
(2)執行結果:sum 運算子的運算元資料類型 nvarchar 無效。
4.SELECT year, COUNT(*) FROM Paper GROUP BY year;
(1)正確的 SQL 語法。
(2)執行結果:
year |
|
2015 |
1 |
2017 |
1 |
2020 |
1 |
2021 |
1 |
2022 |
5 |
5.SELECT year, COUNT(*) FROM Paper ORDER BY year;
(1)錯誤的 SQL 語法。
(2)執行結果:
資料行 ‘Paper.year’ 在選取清單中無效,因為它並未包含在彙總函式或 GROUP BY 子句中。
(五)下列SQL語法執行後會產生幾行的資料?
1.SELECT paper_ID FROM Paper WHERE year <= 2022;
(1)產生9行的資料。
(2)執行結果:
paper_ID |
103 |
142 |
199 |
301 |
524 |
524 |
65 |
712 |
87 |
2.SELECT DISTINCT paper_ID FROM Paper WHERE year <= 2022;
(1)產生8行的資料。
(2)執行結果:
paper_ID |
103 |
142 |
199 |
301 |
524 |
65 |
712 |
87 |
3.SELECT AVG(year) FROM Paper GROUP BY journal;
(1)產生3行的資料。
(2)執行結果:
|
2019 |
2020 |
2022 |
註:year 必須是 int 型態,不可以是 date 或 datetime 型態。
4.SELECT * FROM Paper WHERE journal LIKE '%t';
(1)產生2行的資料。
(2)執行結果:
paper_ID |
title |
journal |
vol |
year |
start |
end |
TR-ID |
87 |
Queue |
DataStruct |
32 |
2021 |
27 |
28 |
110 |
65 |
Stack |
DataStruct |
03 |
2020 |
49 |
56 |
110 |
5.SELECT title FROM Paper ORDER BY year;
(1)產生9行的資料。
(2)執行結果:
title |
Sorting |
Dynamic Prog. |
Stack |
Queue |
Mysql DB |
Mysql DB |
Dynamic Prog. |
Hashing |
Mysql DB |
留言列表