我有以下数据:
学生姓名; 学生.RollNum; 学生.Email; 学生。课程;学生。生日;课程.ID ; 课程名; 课程.讲师
现在这是我提出的数据库设计:两个表=> 学生,课程 Student.ID 是添加的新字段-> 学生表的主唯一键
现在查询 John Doe(其 Student.ID=1234)所学的所有课程的查询是什么?
我需要课程的名称,而不是 ID。
我有以下数据:
学生姓名; 学生.RollNum; 学生.Email; 学生。课程;学生。生日;课程.ID ; 课程名; 课程.讲师
现在这是我提出的数据库设计:两个表=> 学生,课程 Student.ID 是添加的新字段-> 学生表的主唯一键
现在查询 John Doe(其 Student.ID=1234)所学的所有课程的查询是什么?
我需要课程的名称,而不是 ID。
我会用 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
家庭作业?您需要一个新表,比如说 StudentCourses,它代表学生和他参加的课程之间的关系。您需要将 CourseId 添加到 Course 表。因此,StudentCourses 定义为:
StudentCourses(StudentId, CourseId)
此时,您将获得参加过的课程并加入:
SELECT Courses.*
FROM Courses JOIN StudentsCourses sc ON sc.CourseId = Courses.CourseId
WHERE sc.StudenId = [DesideredStudentId]
你的桌子设计有缺陷。您将所有课程一起列出在一个列(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
实际上,您需要第三个表来保存每个学生所学的课程,可以像 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
我会添加第三个表来加入学生和课程。这将允许许多学生参加许多课程。该表将存储 StudentId 和 CourseId。然后,您可以使用以下查询获得所需的结果:
SELECT c.Id, c.CourseName
FROM Courses c
INNER JOIN StudentCourse sc
ON c.CourseId = sc.CourseId
WHERE sc.StudentId = 1234