資料庫系統 Database System 施莉萍 2017/12/28
01. Join 02. Subquery 03. Union 01
學生住宿資料(Dormitory_data) 資料表範例 學生資料 (Std_data) Std_id(學號) Std_name(姓名) Gender(性別) Major(科系) Class(班級) 課程資料 (Classroom_data) Course_id(課程代碼) Course_name(課程名稱) Teacher(教師) Credits(學分數) 教室資料 (Course_data) C_id(課程代碼) Course_day(上課星期) Course_period(節) Course_room(上課教室) 學生住宿資料(Dormitory_data) S_id(學號) Building(宿舍代碼) Room_id(房號代碼) 選課資料(Std_course) S_id(學號) Course_id(課程代碼) 02
Join 03 分為: Natural Join Inner Join Outer Join Left Join (Left Outer Join) Right Join (Right Outer Join) 03
Join - Natural Join 選課資料 課程資料 列出學生B00001選課的名稱與授課老師 04
Join - Natural Join SELECT course_data.course_name,course_data.teacher FROM std_course NATURAL JOIN course_data WHERE S_id = ‘B00001’ 選課資料 課程資料 列出學生B00001選課的名稱與授課老師 05
Join - Inner Join 06 列出學生姓名、宿舍代碼、房號代碼 和natural join效果一樣 學生資料 學生住宿資料 和natural join效果一樣 差別在於結合條件的欄位名稱是否相同 列出學生姓名、宿舍代碼、房號代碼 06
2019/5/16 Join - Inner Join SELECT std_name , dormitory_data.room_id , dormitory_data.building FROM std_data INNER JOIN dormitory_data ON std_data.std_id = dormitory_data.S_id; ON std_data.std_id = dormitory_data.S_id; 可省略,前後對調沒關係 列出學生姓名、宿舍代碼、房號代碼 07
錯誤案例說明 如果使用Natual Join,結果會變成如何? 08
Join - Left Join 學生資料 學生住宿資料 列出學生姓名與住宿的宿舍和房號 09
Join - Left Join 學生資料 學生住宿資料 10
Join - Right Join 學生資料 學生住宿資料 列出學生姓名與住宿的宿舍和房號 11
Join - Right Join 學生資料 學生住宿資料 12
Join – Full Join(補充) 13 MySQL並不支援Full Join (Full outer Join) 學生資料 學生住宿資料 MySQL並不支援Full Join (Full outer Join) 13
Join – Full Join(補充) 14
Subquery 15 Subquery又稱為子查詢或巢狀查詢 有的時候子查詢是唯一能夠連接兩個表格的方式。
Subquery 16 SELECT course_name,teacher FROM course_data WHERE course_id IN 列出學生B00001選課的名稱與授課老師 (SELECT course_id FROM std_course WHERE S_id = ‘ B00001 ’) 16
Subquery 17 列出星期一可以修的課程代碼與名稱 SELECT course_id as 課程代碼 ,course_name as 課程名稱 FROM course_data WHERE course_id IN ( SELECT C_id FROM classroom_data WHERE course_day = '星期一') 17
Union 列出星期一或星期二可以修的課程代碼與名稱 (參考第頁範例) 18
Union 19 SELECT course_id AS 課程代碼,course_name AS 課程名稱 FROM course_data WHERE course_id IN ( UNION SELECT C_id FROM classroom_data WHERE course_day = '星期一') SELECT C_id FROM classroom_data WHERE course_day = '星期二') 19
補充( Union , Intersect , Minus ) Minus(差集) = difference MySQL不支援Intersect、Minus 20
練習1 Q1:列出各個老師的姓名與科系 21
練習2 Q2:列出科系為資訊管理的學生名單,並且欄位名稱改成”學生名單” 22
練習3 Q3:列出就讀資訊工程的男生是多少人,並且欄位名稱設定為男生人數 23
練習4 Q4:列出資工系老師的姓名與員工編號與電話 24
練習5 Q5:列出資工系的簡同學與會計系的杜同學的姓名與電話(使用Union) 25