資料庫結構如下 : 學生資料表(學生編號, 身分證字號, 學生姓名, 科系編號, 年級, 班級) Student(sid, idno, sname, did, syear, sclass) 老師資料表(老師編號, 身分證字號, 老師姓名, 科系編號, 老師類別) Teacher(tid, idno, tname, did, ttype) 課程資料表(課程編號, 課程名稱, 科系代號, 學分數, 選修別) Course(cid, cname, did, ccredit, ctype) 開課資料表(開課編號, 課程編號, 老師編號, 修課年級限制, 教室編號) OpenCourse(oid, cid, tid, yearlimit, roomno) 時間資料表(開課編號, 開課時間編號) Schedule(oid, timeno) 選課資料表(學生編號, 開課編號, 成績) Roll(sid, oid, score) 科系資料表(科系編號, 科系名稱) Dept(did, dname) 資料內容如下 : 問題 : (1)請問如何找到學生s0001沒有衝堂…
資料庫的交易(Transaction)功能,能確保多個 SQL 指令,全部執行成功,或全部不執行,不會因為一些意外狀況,而只執行一部份指令,造成資料異常。 例如~ 當要轉帳時,會有一個交易資料,要從甲帳戶扣錢,把錢加到乙帳戶。如果這個交易從甲帳戶扣錢成功,結果乙帳戶的帳號錯誤,無法成功存入,怎麼辦? 如果有一個機制,可以把「從甲帳戶扣錢,把錢加到乙帳戶」當成一個完整的交易,只有兩個作業都成功,才進行交易(就是Commit),否則就取消交易(就是Rollback),這樣就不會出現錯誤。 要點 (1) MySQL 常用的兩個資料表類型:MyISAM 不支援交易功能,所以以下的整理,均是針對 InnoDB 的DML指令而言,DDL 的指令就不能 ROLLBACK。 怎麼知道我的資料表是MyISAM還是InnoDB? 請參考 https://www.mysql.tw/2017/06/innodb-foreign-key.html 開始進入交易模式,可以使用 START TRANSACTION 或是 BEGIN ,並等待 COMMIT 或是 ROLLBACK 來確定要不要確認交易。 要點 (2) SET AUTOCOMMIT=1; 表示每次的…
學生資料表(學生編號, 身分證字號, 學生姓名, 科系編號, 年級, 班級) Student(sid, idno, sname, did, syear, sclass) create table Student( sid char(5) not null, idno char(10), sname char(20), did char(5), syear int, sclass int, primary key (sid)); insert into Student(sid, idno, sname, did, syear, sclass) values ('s0001', 'A123456789', 'John01', 'd0001', 1, 1); insert into Student(sid, idno, sname, did, syear, sclass) values ('s0002', 'A123456780', 'John02', 'd0001', 1, 1); insert into Student(sid…
Customer (Name,Country,CreditLimit) Product (Product, Type, Price) Shipper (Name,Country) (1) Theta Join SELECT * FROM (SELECT * FROM Customer CROSS JOIN SELECT Product,Type FROM Product) WHERE CreditLimit > Price (2) Equi Join SELECT * FROM (SELECT * FROM Customer CROSS JOIN SELECT Product,Type FROM Product) WHERE CreditLimit =2500 (3) Equi Join SELECT * FROM Customer, Shipper WHERE Customer.Country=Shipper.Country (4) Natural Join (Inner Join) SELECT * FROM Customer Natural JOIN Shipper (5) Left Out…