2016-05-31 41 views
-1

我是SQL新手,剛開始在家中創建自己的SQL Management Studio 2014數據庫。所以我仍然在學習基礎知識。 該數據庫被稱爲FitnessClub(我組成的一家虛構公司)。需要關於創建SQL查詢的指導

該數據庫中,我有表:學生,體育和PupilsSports(?我想你把它結合表),請假設我已經在所有表正確排序出來的PK和FK。

我決定添加20個學生和10個運動。我已經連續分配了10個運動項目的前10名學生,這意味着剩下的10名學生沒有被分配到一項運動。

在我的PupilsSports表中,我有PupilID(PK)和SportID(PK)都與另外兩張表中的相應列有關,這就是我添加了10個運動的10個學生的簡單方式這樣的:

+-----+-------+ 
    | P.ID | S.ID | 
    +-----+-------+ 
    | 1 | 1  | 
    | 2 | 2  | 
    | 3 | 3  | 
    | 4 | 4  | 
    | 5 | 5  | 
    | 6 | 6  | 
    | 7 | 7  | 
    | 8 | 8  | 
    | 9 | 9  | 
    | 10 | 10 | 
    +-----+-------+ 

我想創建,我可以運行,找出誰沒有被分配到一個體育小學生列表中的SQL查詢?這可能嗎?

謝謝

+1

是的,這很容易。如果你只是在學習SQL,那麼你最好不要在網上免費提供的教程,也可能是一兩本書,而不是在論壇上提問你想學習的每一種新技術。這個問題是非常基本的。 –

回答

1

外連接和空值的過濾器應該做的伎倆。事情是這樣的:

SELECT 
    * 
FROM 
    Pupils 
    LEFT OUTER JOIN PupilsSports 
    ON Pupils.ID = PupilsSports.PupilID 
WHERE 
    PupilsSports.SportID IS NULL 

基本上是一個外部聯接會給你加入這兩個表,留下的值作爲NULL在沒有匹配記錄發現的完整的超集。因此,對WHERE子句中NULL值的篩選應該減少結果集,使其僅包含未找到匹配連接記錄的那些記錄。

也許一個子查詢的方法代替:

SELECT 
    * 
FROM 
    Pupils 
WHERE 
    ID NOT IN (SELECT PupilID FROM PupilsSports) 

有許多不同的方式來完成任務,我想。可能有趣的學習體驗是查看SQL Management Studio中針對每種方法的查詢執行計劃,並查看它們之間的差異以及潛在瓶頸的位置。

+0

謝謝大衛。就像我的問題聽起來那麼基本,我不知道如何使用子查詢! –

0

的方法很多的皮膚,貓......這裏有一個這是比較容易理解:

SELECT * FROM Pupils WHERE PupilID NOT IN (SELECT PupilID FROM PupilsSports) 
0

爲了不試圖簡單地爲你寫這個查詢,我會試着指出你需要什麼。首先,你需要將這兩張表一起JOIN。 A LEFT JOIN將採用左側表中的所有行,並且僅匹配右側表中的行。

一旦你有一個所有的學生與他們相應的運動(或NULL沒有體育)的清單,那麼你可以使用WHERE語句過濾。請記住,要指示NULL值,您將不得不使用類似WHERE Sports IS NULL而不是使用相等運算符=