根据多个单独的表选择SQL数据

时间:2015-10-23 13:38:59

标签: 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"

然而,我觉得表中的行并没有像我想象的那样加入,并且有一些与此有关。我有多远?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

对不起可能有误读,如果您需要按课程类型进行,课程被标记为dept =计算机,科学,识字等...请执行以下查询:

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'