2015-10-23 44 views
0

我正在做一些SQL練習,並被以下問題困擾。基於多個單獨的表選擇SQL數據

我給出的數據庫模式:

Course (Course#, title, dept) 
Student (Student#, name, program) 
Enrolled (Student#, Course#, grade) 

我嘗試翻譯下面的語句SQL:

名單誰需要計算機課程或科學課程的所有學生的名字。

起初我以爲答案可能是這樣的:

SELECT Sname 
FROM Course,Student,Enrolled 
WHERE Course.dept = "Computer" OR Course.dept = "Science" 

不過,我覺得像在表中的行我想象中的不太加盟,那有什麼了與此。我有多遠?

+0

雙引號用於標識符(例如「Course#」),至少在ANSI SQL中使用單引號(例如'Science')。 (標籤dbms產品使用...) – jarlh

回答

0

如果你有2個療程計算(1)和科學(2),ID分別爲1和2,你需要做這樣的查詢:

SELECT s.first_name, s.last_name FROM students s JOIN enrolled e ON e.student_id = s.id WHERE e.course_id IN(1, 2) 

對不起可能有誤解,如果您需要按課程類型做到這一點,課程被標記爲部門=計算機,科學,素養等。請下面的查詢:

SELECT s.first_name, s.last_name FROM students s JOIN enrolled e ON e.student_id = s.id JOIN courses c ON c.id = e.course_id WHERE c.dept IN('Computing', 'Science') 

或者,如果你想要做一個OR:

SELECT s.first_name, s.last_name FROM students s JOIN enrolled e ON e.student_id = s.id JOIN courses c ON c.id = e.course_id WHERE c.dept = 'Computing' OR c.dept = 'Science' 
2

這不是那麼簡單:首先,你需要加入的表,那麼你就需要按名稱來消除重複:

SELECT s.name 
FROM Student s 
JOIN Enrolled e ON s.Student#=e.Student# 
JOIN Course c ON e.Course#=c.Course# 
WHERE c.dept = 'Computer' OR c.dept = 'Science' 
GROUP BY s.name 

GROUP BY是必要的,因爲同一個學生可同時服用"Computer""Science"課程,在這種情況下,JOIN會爲同一個學生生成多個記錄。在這種情況下,您可以選擇用DISTINCT替換它。

+0

好吧,所以當連接表時,我需要一個屬性來加入? – dgbarrett

+0

@dgbarrett通常你會這樣做。有些情況下,如果您想生成兩張表的笛卡爾乘積,並稍後進行過濾,但這種情況很少發生。 – dasblinkenlight

+0

很酷,說我想檢查一個學生是否參加了這兩種課程。我會用AND替換OR嗎,還是需要再次查詢?因爲一行永遠不會有2個部門? – dgbarrett