2012-06-25 140 views
0

我有以下数据:简单的SQL查询

Student.Name; Student.RollNum; Student.Email; Student.Courses; Student.Birthday; Course.ID;课程名; Course.Instructor

现在我的继承人提出的DB设计:两个表=>学生,课程 Student.ID是一个新的领域added-学生表>主唯一键

现在会是什么查询,检索John Doe(其Student.ID = 1234)采取的所有课程?

我需要课程的名称,而不是ID。

+3

这个功课? –

+0

你的餐桌设计有缺陷。您将所有课程列在一个列(Student.Courses)中,并且您无法正确使用将使用该列中的单个项目的便携式SQL。你需要第三个表格(Enrollments),它将studentID与courseID(可能是一年/学期) –

回答

2

我会用3个表设计它:

Students - ID; Name; RollNum; Email; Birthday; 
Courses - ID; Name; Instructor 
Students_Courses - a join table between the students and the courses 

然后,你可以做以下

SELECT c.Name 
FROM Students s 
INNER JOIN Students_Courses sc 
    ON s.id = sc.studentId 
INNER JOIN Courses c 
    ON sc.course_id = c.courseid 
WHERE s.id = 1234 

或者如果你不希望任何学生信息的,可以缩短查询于:

SELECT c.Name 
FROM Students_Courses sc 
INNER JOIN Courses c 
    ON sc.course_id = c.courseid 
WHERE sc.studentId = 1234 
0

我想补充一个第三个表加入梭哈课程和课程。这将允许许多学生开设许多课程。该表将存储StudentId和CourseId。然后,您可以通过以下查询实现所需的结果:

SELECT c.Id, c.CourseName 
FROM Courses c 
    INNER JOIN StudentCourse sc 
    ON c.CourseId = sc.CourseId 
WHERE sc.StudentId = 1234 
0

作业? 你需要一个新表格,让我们假设StudentsCourses表示一个学生和他参加的课程之间的关系。您需要将CourseId添加到课程表。所以StudentsCourses被定义为:

StudentCourses(StudentId, CourseId) 

在这一点上,你有加入获得参加课程:

SELECT Courses.* 
FROM Courses JOIN StudentsCourses sc ON sc.CourseId = Courses.CourseId 
WHERE sc.StudenId = [DesideredStudentId] 
0

你的表的设计是有缺陷的。您将所有课程列在一个列(Student.Courses)中,并且您无法正确使用将使用该列中的单个项目的便携式SQL。你需要第三个表格(Enrollments),它将studentID与courseID(可能是一年/学期)配对。

不过,假设你加入这个表中,SQL会是这个样子:

SELECT c.Name 
FROM Enrollments e 
INNER JOIN Courses c on c.ID = e.CourseID 
WHERE e.StudentID = 1234 
0

其实你需要保存每个学生所学课程的第三表,可为2列一样简单表(StudentId,CourseId)和查询将是

SELECT c.Name 
FROM Students as s 
JOIN CoursesTaken as t on t.StudentId = s.Id 
JOIN Courses as c on c.id = t.CourseId 
WHERE s.Id = 1234