0

我有以下数据:

学生姓名; 学生.RollNum; 学生.Email; 学生。课程;学生。生日;课程.ID ; 课程名; 课程.讲师

现在这是我提出的数据库设计:两个表=> 学生,课程 Student.ID 是添加的新字段-> 学生表的主唯一键

现在查询 John Doe(其 Student.ID=1234)所学的所有课程的查询是什么?

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

4

5 回答 5

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
于 2012-06-25T21:20:51.487 回答
0

家庭作业?您需要一个新表,比如说 StudentCourses,它代表学生和他参加的课程之间的关系。您需要将 CourseId 添加到 Course 表。因此,StudentCourses 定义为:

StudentCourses(StudentId, CourseId)

此时,您将获得参加过的课程并加入:

SELECT Courses.*
FROM Courses JOIN StudentsCourses sc ON sc.CourseId = Courses.CourseId
WHERE sc.StudenId = [DesideredStudentId]
于 2012-06-25T21:23:21.720 回答
0

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

但是假设你添加了这个表,sql看起来像这样:

SELECT c.Name
FROM Enrollments e
INNER JOIN Courses c on c.ID = e.CourseID
WHERE e.StudentID = 1234
于 2012-06-25T21:23:37.343 回答
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
于 2012-06-25T21:32:22.190 回答
0

我会添加第三个表来加入学生和课程。这将允许许多学生参加许多课程。该表将存储 StudentId 和 CourseId。然后,您可以使用以下查询获得所需的结果:

SELECT c.Id, c.CourseName
FROM Courses c
    INNER JOIN StudentCourse sc
     ON c.CourseId = sc.CourseId
WHERE sc.StudentId = 1234
于 2012-06-25T21:22:25.343 回答