我們在" 從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…
(1)建立資料庫 create database myhome character set utf8 collate utf8_general_ci; 建立mycategory CREATE TABLE mycategory ( cid char(3) NOT NULL, cname varchar(30), cflag char(1), PRIMARY KEY (cid) ); 建立mymoney CREATE TABLE mymoney ( mid char(10) NOT NULL, cid char(3) NOT NULL, mdate char(8), mamount int(7), mperson char(1), PRIMARY KEY (mid) ); (2)歲末時想知道今年每個月的汽油費用開銷多少,應該如何寫出SQL? select sum(mamount) from mymoney where cid='003' group by substr(mdate,1,6); ※如果要知道「每年 汽油費用開銷多少 」,應該如何寫SQL呢? (3)歲末時要知道今年每個月的收支狀況,應該如何寫…