111年國家安全情報人員三等資料庫應用

一、一篇學術文章通常有許多屬性包括唯一編號 (paper_ID)、論文名稱 (title)、發表期刊 (journal)、發表卷期 (vol)、發表年 (year)、起始頁 (start) 及結束頁(end)若可對應到先前提出過的一或多篇技術報告則另加上該技術報告編號 (TR-ID)。每一本期刊一年可出刊多次,每次都有不同的卷期 (連續但不重複),且視論文長短,結束頁一定不會小於起始頁,且不會把兩篇論文(部分) 內容編排在同一頁。請用以下關連及資料表回答問題。

    Paper (ID, title, journal, vol, year, start, end, TR-ID)

   pic01.png

    ()下列那幾個是正確的 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正規化,並寫出正規化後的關連

pic02.png

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_IDR2.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}yearyear 遞移相依於主鍵 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正規化:

  R1R21R22 的決定因素是此關聯的候選鍵,所以都符合 BCNF

5.正規化處理的結果:

  (1)R1(paper_ID, TR-ID)

    主鍵:{paper_ID, TR-ID},外鍵:paper_IDR21.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

 

arrow
arrow
    文章標籤
    資料庫應用
    全站熱搜
    創作者介紹
    創作者 jacksaleok 的頭像
    jacksaleok

    國考資訊處理工作室(高考二級資訊處理/高考三級資訊處理/調查局三等/關務人員三等/地方特考三等)

    jacksaleok 發表在 痞客邦 留言(0) 人氣()