如何從需求的條件寫出SQL指令?





需求~要列出符合【某個條件】的【某項資料】,應該如何寫出SQL指令呢?

第一步 : 找齊資料表。

【某項資料】是在哪個資料表? 以及【某個條件】中的判斷條件是在哪個資料表? 所以這個步驟 ,就可以把資料表都找齊了。

第二步 : 篩選出來【正確的資料表】。

但是許多情況,【某項資料】會存在許多資料表中,這個時候就要判斷,哪個資料表才是正確的。 方法就是把第一步找到的資料表,畫出關聯性,【某項資料】一定會存在具有關聯性的資料表中。所以就可以把不在關聯的資料表刪除。

第三步 : 套用再調整。

套用
SELECT 【某項資料】
FROM 【正確的資料表】
WHERE 【某個條件】AND 主鍵外鍵的關聯
其他部分 (如GROUP BY、HAVING、ORDER BY等等)

調整
看看那些欄位需要冠上 ~ 資料表.資料欄,例如 學生資料表.學生姓名

例如~ 要列出開課編號為o0001的「開課編號」、「學生姓名」。

由第一步,相關的欄位是開課編號、「學生姓名」。「學生姓名」存在於學生資料庫,開課編號」存在於選課資料表、開課資料表、時間資料表。

由第二步,學生資料庫與選課資料表,透過學生編號來產生關聯。開課資料表、時間資料表則跟學生資料庫沒有關聯。

由第三
SELECT 開課編號,學生姓名 FROM 學生資料庫 s,選課資料表 r WHERE 開課編號='o0001' AND s.sid=r.sid;

【練習】
資料表如下:
學生資料表(學生編號,身分證字號,學生姓名,科系編號,年級,班級)
老師資料表(老師編號,身分證字號,老師姓名,科系編號,老師類別)
選課資料表(學生編號,開課編號,成績)
開課資料表(開課編號,課程編號,老師編號,修課年級限制,教室編號)
時間資料表(開課編號,開課時間編號)
課程資料表(課程編號,課程名稱,科系代號,學分數,選修別)
科系資料表(科系編號,科系名稱)

(1)要列出學生編號為s0001所修課程的「開課編號」,請寫出SQL指令。

SELECT 開課編號 FROM 選課資料表 WHERE 學生編號='s0001';

(2)要列出開課編號為o0001的「開課編號」、「學生姓名」,請寫出SQL指令。

SELECT 開課編號,學生姓名 FROM 選課資料表 r,學生資料表 s WHERE 開課編號='o0001' AND r.學生編號=s.學生編號;

(3)要列出學生編號為s0001所修課程的「開課時間編號」,請寫出SQL指令。

SELECT 開課時間編號 FROM 時間資料表 s,選課資料表 r WHERE 學生編號='s0001' AND s.開課編號=r.開課編號;

說明 :
時間資料表 , 選課資料表 不是沒有主鍵外鍵的關聯嗎? 為何可以同時選取呢?
其實正常來說,原本應該是選 ~ 開課資料表, 選課資料表, 時間資料表

而~選課資料表與開課資料表是主鍵外鍵的關聯,時間資料表開課資料表也是主鍵外鍵的關聯

因此得到 ~

SELECT 開課時間編號 FROM 時間資料表 s,選課資料表 r, 開課資料表 o WHERE 學生編號='s0001' AND o.開課編號=r.開課編號 AND s.開課編號=o.開課編號;

從 o.開課編號=r.開課編號 AND s.開課編號=o.開課編號 ,可以看到其實也是~r.開課編號=s.開課編號

所以開課資料表其實可以省略。也就是以下(a)(b)是一樣的 :

(a) SELECT 開課時間編號 FROM 時間資料表 s,選課資料表 r, 開課資料表 o WHERE 學生編號='s0001' AND o.開課編號=r.開課編號 AND s.開課編號=o.開課編號;

(b) SELECT 開課時間編號 FROM 時間資料表 s,選課資料表 r WHERE 學生編號='s0001' AND s.開課編號=r.開課編號;

(4)要列出有選修開課時間編號為11的「學生姓名」,請寫出SQL指令。

SELECT 學生姓名 FROM 時間資料表 s,學生資料表 st,選課資料表 r WHERE 開課時間編號=11 AND s.開課編號=r.開課編號 AND r.學生編號=st.學生編號;

(5)要列出學生編號為s0001所修課程的「課程編號」與「課程名稱」,請寫出SQL指令。

SELECT c.課程編號,c.課程名稱 FROM 課程資料表 c, 開課資料表 o, 選課資料表 r WHERE r.學生編號='s0001' AND r.oid=o.oid AND c.cid=o.cid;

(6)要列出學生與老師的「身分證字號」,請寫出SQL指令。

(SELECT 身分證字號 FROM 學生資料表) UNION (SELECT 身分證字號 FROM 老師資料表) ;

(7)要列出所有學生的「身分證字號」與「學生姓名」,請寫出SQL指令。

SELECT 身分證字號,學生姓名 FROM 學生資料表;

(8)要列出所有學生的「學生姓名」與「科系名稱」,請寫出SQL指令。

SELECT 學生姓名,科系名稱 FROM 學生資料表 s,科系資料表 d WHERE s.did=d.did;

(9)要列出學生姓名為王曉明的「科系名稱」,請寫出SQL指令。

SELECT 科系名稱 FROM 學生資料表 s,科系資料表 d WHERE s.did=d.did AND s.學生姓名='王曉明';

(10)要列出學生姓名為王曉明所屬科系的所有「老師姓名」,請寫出SQL指令。

SELECT 老師姓名 FROM 老師資料表 WHERE 科系編號=( SELECT 科系編號 FROM 學生資料表 s,科系資料表 d WHERE s.did=d.did AND s.學生姓名='王曉明')

OR

SELECT 老師姓名 FROM 老師資料表 WHERE 科系編號 IN ( SELECT 科系編號 FROM 學生資料表 s,科系資料表 d WHERE s.did=d.did AND s.學生姓名='王曉明')

OR

SELECT 老師姓名 FROM 老師資料表 t, 學生資料表 s, 科系資料表 d WHERE d.科系編號=s.科系編號 AND d.科系編號=t.科系編號

張貼留言

0 留言