2012-05-12 46 views
0

我是新來的sql 我有2個表第一個帶有標記,第二個帶有學生。 標記有一個標記ID的主鍵,學生有主鍵學生ID。 我想知道兩張桌子之間應該有什麼關係,所以每個學生都可以有不同的標記。 和什麼將是sql查詢來獲取他們的數據。什麼應該是兩個表之間的關係,所以每個學生可以有不同的標記

我曾經試過一次用這個選擇查詢 S =「選擇s.Student名稱,從學生小號z.Hourly1Marks,標誌着Z」 一個關係,但它顯示的條目的笛卡爾乘積。

回答

0

研究INNER JOIN(如果每個學生有一個標記,即1:1關係)和LEFT JOIN(如果每個學生可以有多個標記,即1:n關係)的概念。

您使用了沒有限制的內部連接。你需要的是像

SELECT S.name, Z.marks 
FROM students S 
    JOIN marks Z ON S.student_id = Z.student_id 

或等價

SELECT S.name, Z.marks 
FROM students S, marks Z 
WHERE S.student_id = Z.student_id 

爲1:1的關係的情況下,或

SELECT S.name, Z.marks 
FROM students S 
    LEFT JOIN marks Z ON S.student_id = Z.student_id 

爲1:N的關係的情況下。

+0

內部連接也覆蓋1:N關係。左(外)連接唯一有用的時候是當你在連接列上有空或者不匹配的值時,我不確定是否適用於他的問題。你的答案中也沒有明確區分。 –

+0

@TimPote:當有人說1:N時,通常認爲'N> = 0',因爲這種關係遠遠超過'N> 0',這使得內部連接適用於1:N關係例外的規則。如果學生有可能有幾個分數,那麼他很有可能不會有任何 - 內連接失敗。 – Amadan

0

假如你有兩個表:

Students 
-------------- 
IDStudent 
Name 
.... 

Marks 
-------------- 
IDMarks 
Hourly1Marks 

和Studend和標記之間的關係是「一個學生可以有0個或多個商標」,那麼你需要在表格標記添加一列 - 稱之爲studentID並且此列用作學生表的外鍵。

,那麼你可以這樣寫查詢

select s.Name, z.Hourly1Marks 
from Student s left join marks z 
    on z.studentID = s.IDStudent 

,會給你回所有的學生和他們的標記(也沒有任何標誌的學生) 或者,如果只需要學生提供至少一個標記

select s.Name, z.Hourly1Marks 
from Student s inner join marks z 
    on z.studentID = s.IDStudent 
相關問題