SQL 正規化 SELECT 範例
SQL 正規化 SELECT 範例
資料來源: http://www.mysql.tw/2015/05/select.html
學號 |
學生姓名 |
學生電話 |
課程代號 |
課程名稱 |
年級 |
老師姓名/電話 |
老師代號 |
科系代號 |
科系名稱 |
成績 |
101001 |
張大頭 |
0910111222 |
A001 |
資料庫 |
三年級 |
王老師 0933111333 |
001 |
001 |
資管系 |
80 |
A002 |
網路概論 |
林老師 0955111222 |
002 |
003 |
資工系 |
50 |
||||
101002 |
劉三哥 |
0912333222 |
A003 |
程式設計 |
三年級 |
孫老師 0912000333 |
003 |
001 |
資管系 |
85 |
A002 |
網路概論 |
林老師 0955111222 |
002 |
003 |
資工系 |
76 |
我們正規化後,資料結構如下~
studnt 學生資料表 (studno, studname, deptid)
teacher 老師資料表 (teano, teaname, deptid)
department 科系資料表 (deptid, deptname)
telephone 電話資料表 (ownerno, tel)
coursemain 課程資料表 (courseid, coursename, coursecredit, courseflag, deptid)
courseopen 開課資料表 (yearsemester, courseid, teano, coursetime, roomid)
course 學生選課單 (yearsemester, courseid, studno, score)
規化後,請寫出以下SQL Command:
(1)列出學生張大頭的所有選修的課程代號。
SELECT c.courseid FROM course c, student s WHERE c.studno=s.studno AND s.studname=’張大頭’;
(2)列出學生張大頭的所有選修的課程名稱。
SELECT m.coursename FROM course c, student s, coursemain m WHERE c.courseid=m.courseid AND c.studno=s.studno AND s.studname=’張大頭’;
(3)列出學生張大頭的所有選修的課程名稱,以及成績。
SELECT m.coursename, c.score FROM course c, student s, coursemain m WHERE c.courseid=m.courseid AND c.studno=s.studno AND s.studname=’張大頭’;
(4)列出學生張大頭的所有電話。
SELECT t.tel FROM telephone t, student s WHERE t.ownerno=s.studno AND s.studname=’張大頭’;
(5)列出林老師所有開課的總學生人數。
SELECT COUNT(*) FROM course c, courseopen co, teacher t WHERE c.courseid=co.courseid AND co.teano=t.teano AND t.teaname=’林老師’;
(6)列出選修程式設計的學生名單。
SELECT s.studno, s.studname FROM student s, course c, coursemain cm WHERE s.studno=c.studno AND c.courseid=cm.courseid AND cm.coursename=’程式設計’;
(7)列出每位學生的平均分數。
SELECT studno, AVG(score) FROM course GROUP BY studno;
(8)列出所有課程成績未達60的學生姓名。
SELECT s.studname FROM course c, student s WHERE c.studno=s.studno AND c.score<60;
(9)列出資工系的所有開課課程名稱。
SELECT cm.coursename FROM coursemain cm, courseopen co, department d WHERE cm.courseid=co.courseid AND cm.deptid=d.deptid AND d.deptname=’資工系’;
(10)列出電話、所有人姓名。
(SELECT studname as name, tel FROM telephone t,student s where t.ownerno=s.studno) UNION (SELECT teaname as name, tel FROM telephone t,teacher tea where t.ownerno=tea.teano);
(11)列出沒有開課的老師編號、姓名。
SELECT teano,teaname FROM teacher WHERE teano NOT IN (SELECT teano FROM courseopen);
(12)列出每個學生的修課學分總數。
SELECT c.studno,sum(coursecredit) FROM course c,coursemain cm WHERE c.courseid=cm.courseid GROUP BY c.studno;