有如下表單,你應該如何進行正規化呢? 學號 學生姓名 學生電話 課程代號 課程名稱 年級 老師姓名/電話 老師代號 科系代號 科系名稱 成績 101001 張大頭 0910111222 0922111000 A001 資料庫 三年級 王老師 0933111333 001 001 資管系 80 A002 網路概論 林老師 0955111222 002 003 資工系 50 101002 劉三哥 0912333222 0922111333 A003 程式設計 三年級 孫老師 0912000333 003 001 資管系 85 A002 網路概論 林老師 0955111222 002 003 資工系 76 我們正規化後,資料結構如下~ studnt 學生資料表 ( studno , studname, deptid) teacher 老師資料表 ( teano , teaname, deptid) department 科系資料表 ( deptid , deptname) telephone 電話資料表 ( ownerno, tel ) cou…
SELECT的基本語法如下~ 依照給予的條件,抓出資料。 SELECT * | {[DISTINCT, DISTINCTROW] field_list} FROM table_list WHERE conditions GROUP BY {field_list} [ASC,DESC] HAVING conditions ORDER BY {field_list} [ASC,DESC] 假設有以下表單 student( studno , studname, deptid) 學生資料表 course( yearsemester, courseid, studno , score) 選課單 coursemain( courseid , coursename, coursecredit, courseflag, deptid) 課程基本資料表 teacher( teano , teaname, deptid) 教師資料表 courseopen( yearsemester, courseid , teano, coursetime, room) 教師開課表 dept( deptid , deptname) 科系資料表 1. SELECT * F…
關聯模式的運算是將關聯進行運算,或是跟另外的關聯進行運算。 (1) SELECT運算子 ( s) 表示法: Result = s <選擇條件 > (R) 意思是指,從關聯R中,選擇出符合 <選擇條件>的資料。 這樣子好像有點難以理解,其實就是~使用 SELECT語法,從 關聯R中取出資料。 例如 關聯R為(studentNo, studentName, studentDeptID),我們就可以使用如下運算: SELECT * FROM R WHERE studentDeptID='0001'; 其中 studentDeptID='0001'就是 <選擇條件> (2) PROJECT運算子( π ) 表示法: Result = π <屬性串列 > (R) 意思是指,從關聯R中,選擇出某些屬性 的資料。 例如 關聯R為(studentNo, studentName, studentDeptID),我們就可以使用如下運算: SELECT studentNO, studentName FROM R; 但是經常 s跟 π經常一起使用,例如: …
關聯模式的五大鍵,各是Super key、Candidate Key、Primary Key、Alternate Key、Foreign Key。靠著這些鍵的特性,讓關聯模式可以用來描述實體世界的資料。 更多參考資料 : MySQL使用者權限設定 關聯模式 可以比實體關係模式(ERM)更精準的描述資料,他有幾個條件必須滿足: (1)定義域限制: 指資料庫的關聯中的每個屬性質,必須符合該屬性的定義,例如產品名稱必須是字串,薪水必須是整數數字等。 (2)關聯鍵限制: 指資料庫的關聯中必須有關聯鍵的定義,也就是Super key、Candidate Key、Primary Key、Alternate Key、Foreign Key。這些定義我們稍後再來解釋。 (3)實體完整限制: 如果關聯存在主鍵(Primary Key),則不能為空。因為如果為空值,無法得知其相關的屬性值到底是描述哪一個實體。 (4)參考完整限制: 如果關聯存在外鍵(Foreign Key)為非空值,必須有可以參考的主鍵(Primary Key)。因為如果外鍵存在,而無法關連到其他表格的主鍵,這個關聯存在就沒有意義。 (5)語意完整限制: 這個限制不是必須的,但是可以更完備的描述實體世界的資料…
Data Modeling (資料塑模) 就是一種程序,用來定義跟分析資料需求,來支援某個商業程序。 下面就是維基百科所描述的資料塑模方法: 但是以上的方法,先經過邏輯塑模(Logical Data Model),再經過概念塑模(Conceptual Data Model),最後進行實體塑模(Physical Data Model)。 我們建議資料塑模,使用下圖的方式: 也就是先經過概念塑模(Conceptual Data Model),然後進行邏輯塑模(Logical Data Model),最後進行實體塑模(Physical Data Model)。 概念塑模(Conceptual Data Model)使用的工具,就是實體關係模型(Entity Relationship Model),最後會產生實體關係圖(Entity Relationship Diagram)。 邏輯塑模(Logical Data Model)使用的工具,就是關聯模型(Relational Model),最後會產生資料表的定義關聯綱目(schema)。 實體塑模(Physical Data Model)使用的工具,就是資料庫管理系統,或是 SQL語法,最後會產生真…
某公司希望設計一個提供員工中午訂餐的服務,該系統需求如下: (1)該系統有數個餐廳的餐點提供員工點餐。 (2)該系統在每天早上讓員工線上點餐。 (3)為方便結帳,該系統採用預付制,也就是先存錢給秘書,然後依照訂餐扣款。 (4)希望每個訂餐依照所訂購的每位同事帳戶下扣款。 (5)每個每個人可以訂購多項餐點,也可以跨不同餐廳訂購。 (6)員工帳戶資料要能夠記載預付時間、金額,以及扣款時間、金額及對應的餐點。 (7)該系統必須能夠提供每位員工統計報告,記載每月的餐費。 (8)該系統必須能夠統計各餐廳/餐點的消費紀錄,以便知道員工對於餐廳/餐點的喜好。 該系統的 ERD應該如何設計呢? 該系統的實際資料庫應該如何設計呢? 步驟一: 先找出物件 (Entity) 員工(Employee)、餐廳(Restaurant)、餐點(Item)、帳戶(Account)、帳戶紀錄(Account Log)、訂單(Order)、訂單紀錄(Order Item),我們也可以再多出一個部門物件,以紀錄員工的部門。 所以總共八個物件。 步驟二: 再找出物件間的關係 (Relationship) 餐廳(Restaurant) --> 餐點(Item) 員工(E…
我們在" 從ER Model到資料庫的實作練習 ",了解從ER Model到資料庫的形成步驟,現在來進行實際的實體資料庫建立。 假設資料庫的關聯及結構如下圖 (下圖是以Access的工具製作而成): 其邏輯資料庫可以表示如下: 課程資料表 course( cid ,cname,credit,tid) 老師資料表 teacher( tid ,tname,tarea) 學生資料表 student( sid ,sname,did) 科系代碼表 department( tid ,tname,tboss) 選課資料表 enrollment( sid , cid ,score) 學務處資料表 score1( serial ,sid,score) 教務處資料表 score2( serial ,sid,score) 但是這個資料庫結構設計有些問題: (1)沒有表示年度與學期 (2)教務處資料表的學業成績是甚麼? (3)課程資料表是用來給學生選課,應該分成~課程基本資料表+開課資料表 所以我們將之更新如下: 課程基本資料表 course( cid ,cname,credit,ctype,did) 開課資料表 cour…
SQL語法中WHERE與HAVING有何差異? 這兩個都是在進行資料的過濾,但是在使用上是有差別的。 在SQL語法中,我們可以使用WHERE給予條件,進行資料的過濾,例如有如下資料表: 我們使用 SELECT * FROM mymoney WHERE mamount>1000; 如下,資料只顯示出金額大於1000的資料列。 但是如果我們使用 SELECT * FROM mymoney HAVING mamount>1000; 雖然沒有錯誤,但是就不是好的語法了。 為何呢? 因為HAVING只能用在aggregate (合計) 情況下 ,也就是有GROUP BY的時候,並且HAVING要過濾的條件,要跟GROUP BY的合計函數有關。 例如我們來看以下範例: SELECT SUM(mamount) FROM mymoney WHERE SUBSTR(mdate,1,6)='201401'; 列出符合201401條件的金額加總,如上列出75500。 SELECT SUM(mamount) FROM mymoney WHERE SUBSTR(mdate,1,6)=…
假設有以下資料表 class, classmain, teacher, student, dept, tea, stud ~ (1) SELECT * FROM CLASS; (2) SELECT sid, cid FROM CLASS; (3) SELECT sid AS s, cid AS c FROM CLASS; (4) 模擬SELECT INTO語法 (MYSQL不支援SELECT INTO) INSERT INTO myclass (class_no,class_name) SELECT cid, classname FROM classmain; (5) SELECT * FROM classmain WHERE cid>'C004'; (6) SELECT * FROM class WHERE score>60 AND cid='C005'; (7) SELECT * FROM class WHERE cid='C005' AND NOT score>60; (8) SELECT * FROM class WHERE score …
在關聯式代數中,有以下幾種不同的運算: -- 限制 (Restrict) ~ 選取符合某些條件的值組(記錄),另成一個新的關聯表。 例如: SELECT * FROM tableA WHERE [conditions] -- 投影 (Project) ~ 選取想要的欄位(屬性),另成一個新的關聯表。 例如: SELECT [some fields] FROM tableA -- 卡氏積 (Cartesian Product) ,又稱Cross Product(交叉乘積)、Cross Join(交叉合併) ~ 將兩個關聯表相乘,形成一個新的關聯表。但是光是關聯表相乘,並不是我們真正需要的,所以通常相乘後,都還需要加上另外的條件。 例如: SELECT * FROM tableA, tableB 或是: SELECT * FROM tableA CROSS JOIN tableB 上面兩個表示法,得到的結果是相同的。 例如兩個表單 student (五筆資料) 與 class (十筆資料) ,資料表內容如下: 我們以SELECT * FROM student, class; 及SELECT * FROM student CROSS JOIN…