我正在做一些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 :(得分: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'