-[作業-miro](https://miro.com/app/board/uXjVLMcM_hQ=/) ### 作業一:拯救明華國小的資料庫,哪個欄位適合變成外來鍵? ``` CREATE TABLE classes ( id SERIAL PRIMARY KEY, name VARCHAR(50) ); INSERT INTO classes (name) VALUES ('三年一班'), ('三年二班'); CREATE TABLE students ( id SERIAL PRIMARY KEY, name VARCHAR(50), class_id INTEGER, sex BOOLEAN, --true 男生 false 女生 age INTEGER, FOREIGN KEY (class_id) REFERENCES classes(id) ); INSERT INTO students (name, class_id, sex, age) VALUES ('小明', 1, true, 8), ('小華', 2, false, 9), ('小美', 1, true, 8), ('小強', 1, false, 8), ('小智', 2, true, 9); ``` ### 作業二:第一題的延伸,多了一欄班級老師 ``` CREATE TABLE teachers ( id SERIAL PRIMARY KEY, name VARCHAR(50), class VARCHAR(50) ); INSERT INTO teachers (name, class) VALUES ('廖洧杰', '三年一班'), ('卡斯柏', '三年二班'), ('查理', '三年一班'), ('麥可', '三年一班'), ('李燕容', '三年二班'); CREATE TABLE students ( id SERIAL PRIMARY KEY, name VARCHAR(50), teacher_id INTEGER, sex BOOLEAN, --true 男生 false 女生 age INTEGER, FOREIGN KEY (teacher_id) REFERENCES teachers(id) ); INSERT INTO students (name, teacher_id, sex, age) VALUES ('小明', 1, true, 8), ('小華', 2, false, 9), ('小美', 3, true, 8), ('小強', 4, false, 8), ('小智', 5, true, 9); SELECT students.id AS 學生編號, students.name AS 姓名, teachers.class AS 班級, teachers.name AS 班級老師, students.sex AS 性別, students.age AS 年齡 FROM students INNER JOIN teachers ON students.teacher_id = teachers.id; ``` ![image](https://hackmd.io/_uploads/SJj07bGX1l.png) ### 作業三:小孩的家庭歸類資料庫 ``` CREATE TABLE parents ( id SERIAL PRIMARY KEY, name VARCHAR(50), telephone VARCHAR(50), sex BOOLEAN --true 男生 false 女生 ); INSERT INTO parents (name, telephone, sex) VALUES ('王大祥', '0973254254', true), ('王曉如', '0955717855', false); CREATE TABLE students ( id SERIAL PRIMARY KEY, name VARCHAR(50), parent_id INTEGER, FOREIGN KEY (parent_id) REFERENCES parents(id) ); INSERT INTO students (name, parent_id) VALUES ('小明', 1), ('小華', 2), ('小美', 1), ('小強', 2), ('小智', 1); SELECT students.id AS 小孩編號, students.name AS 姓名, parents.name AS 父母名稱, parents.telephone AS 父母電話, parents.sex AS 父母性別 FROM students INNER JOIN parents ON students.parent_id = parents.id; ``` ![image](https://hackmd.io/_uploads/SJwjNZGQJe.png) ### 上一位同學的題目 ![image](https://hackmd.io/_uploads/r1VNxZz71l.png) a. 請優化此表格。 b. 查出有誰沒有還書 c. 借閱時間是30天,超過一天罰100元,請問有誰超過時間了?要被罰多少錢? ``` -- 創建作者表 CREATE TABLE authors ( id SERIAL PRIMARY KEY, name VARCHAR(50) ); --輸入資料 INSERT INTO authors (name) VALUES ('小邏邏'), ('神仙教母'), ('隔壁老王'), ('周鋁輪'), ('胡弟'), ('佩豬'), ('柯北'); ``` ![image](https://hackmd.io/_uploads/r1QP_bMQkx.png) ``` -- 創建借閱者表 CREATE TABLE borrowers ( id SERIAL PRIMARY KEY, name VARCHAR(50) ); -- 輸入資料 INSERT INTO borrowers (name) VALUES ('小明'), ('小花'), ('小王'), ('小黑'), ('仙度瑞拉'), ('安弟'), ('小毛'); ``` ![image](https://hackmd.io/_uploads/ByR2lzGQ1l.png) ``` -- 創建書本表 CREATE TABLE books ( id SERIAL PRIMARY KEY, name VARCHAR(50), author_id INTEGER, borrower_id INTEGER, checkout_date TIMESTAMP, checkin_date TIMESTAMP, FOREIGN KEY (author_id) REFERENCES authors (id), FOREIGN KEY (borrower_id) REFERENCES borrowers (id) ); -- 輸入資料 INSERT INTO books (name, author_id, borrower_id, checkout_date, checkin_date) VALUES ('數位邏輯', 1, 1, '2024-01-01', '2024-01-15'), ('將南瓜變馬車', 2, 2,'2024-01-02', '2024-01-05'), ('時間管理大師祕技', 3, 3,'2024-01-03', '2024-01-31'), ('絆倒鋁盒', 4, 4,'2024-01-04', '2024-02-29'), ('12點前要離開舞會', 2, 5,'2024-01-10', '2024-01-12'), ('人工智能大合集', 1, 3, '2024-01-15', null), ('我的靴子裡有蛇',5, 6,'2024-01-17', '2024-02-06'), ('豬排要怎麼煮比較好吃',6, 4,'2024-01-20', '2024-02-02'), ('麻醉針使用',7,7,'2024-01-27', '2024-02-29'); -- 篩選 SELECT books.id AS 書本編號, books.name AS 書名, authors.name AS 作者, borrowers.name AS 借閱者, books.checkout_date AS 借閱日期, books.checkin_date AS 還書日期 FROM books INNER JOIN authors ON books.author_id = authors.id INNER JOIN borrowers ON books.borrower_id = borrowers.id; ``` ![image](https://hackmd.io/_uploads/HJqreGMXyg.png) ``` -- 找出誰沒還書 SELECT books.name AS 書名, borrowers.name AS 借閱者 FROM books INNER JOIN borrowers ON books.borrower_id = borrowers.id WHERE books.checkin_date ISNULL; ``` ![image](https://hackmd.io/_uploads/BkGmHfM71x.png) ``` -- 找出逾期不還者及總罰金 SELECT books.name AS 書名, borrowers.name AS 借閱者, (EXTRACT(EPOCH FROM (books.checkin_date - books.checkout_date)) / 86400 - 30) * 100 AS 罰鍰 FROM books INNER JOIN borrowers ON books.borrower_id = borrowers.id WHERE EXTRACT(EPOCH FROM (books.checkin_date - books.checkout_date)) / 86400 > 30; ``` ![image](https://hackmd.io/_uploads/Bk43dMz7yx.png)