Oracle三张表之间的多对多关系实现(oracle三张表多对多)
Oracle三张表之间的多对多关系实现
在Oracle数据库中,多对多关系是非常常见的。如果要创建一个多对多关系,我们就需要使用3张表并建立它们之间的关联关系。本文将介绍如何在Oracle数据库中实现三张表之间的多对多关系。
我们需要创建3张表。在这个例子中,我们将创建一个“学生(students)”表、一个“课程(courses)”表和一个“选课(enrollments)”表。这些表的结构如下:
CREATE TABLE students (
id NUMBER(10) PRIMARY KEY, name VARCHAR2(50) NOT NULL,
eml VARCHAR2(50) NOT NULL);
CREATE TABLE courses ( id NUMBER(10) PRIMARY KEY,
name VARCHAR2(50) NOT NULL, credits NUMBER(2) NOT NULL
);
CREATE TABLE enrollments ( student_id NUMBER(10) REFERENCES students(id),
course_id NUMBER(10) REFERENCES courses(id), grade VARCHAR2(2),
PRIMARY KEY (student_id, course_id));
在上述三张表中,学生表和课程表都有一个id列作为主键。在enrollments表中,由于多个学生和多个课程都可以有多次选课,我们需要将联合主键设置为学生id和课程id,以确保每个学生只能在同一课程上选择一次,并且每个课程只能由同一学生选一次。
下一步是创建各自表的数据,为了简化本示例,我们只插入了一些测试数据:
INSERT INTO students (id, name, eml)
VALUES (1, '张三', 'zhangsan@example.com');
INSERT INTO students (id, name, eml) VALUES (2, '李四', 'lisi@example.com');
INSERT INTO courses (id, name, credits) VALUES (1, '数据库', 3);
INSERT INTO courses (id, name, credits) VALUES (2, 'Java', 4);
INSERT INTO enrollments (student_id, course_id, grade) VALUES (1, 1, 'A');
INSERT INTO enrollments (student_id, course_id, grade) VALUES (1, 2, 'B');
INSERT INTO enrollments (student_id, course_id, grade) VALUES (2, 1, 'C');
INSERT INTO enrollments (student_id, course_id, grade) VALUES (2, 2, 'B');
现在我们已经创建了三张表并向它们中添加了数据,下一步是检索它们并执行一些查询操作。
假设你想知道哪些学生选择了某些课程,我们可以使用以下查询语句:
SELECT students.name, courses.name
FROM studentsJOIN enrollments ON students.id = enrollments.student_id
JOIN courses ON courses.id = enrollments.course_idWHERE courses.name IN ('数据库', 'Java');
这个查询语句将返回所有选了“数据库”和“Java”这两门课程的学生姓名和课程名称。信息如下:
张三 数据库
张三 Java李四 数据库
李四 Java
同时,如果想知道某门课程的所有选修学生成绩,可以使用以下查询语句:
SELECT students.name, enrollments.grade
FROM studentsJOIN enrollments ON students.id = enrollments.student_id
JOIN courses ON courses.id = enrollments.course_idWHERE courses.name = 'Java';
此语句返回“Java”此门课程所有学生成绩,信息如下:
张三 B
李四 B
在Oracle数据库中,实现多对多关系是一件非常容易的事情。我们只需要建立三张表,正确地设置每个表之间的关联关系,并执行适当的查询语句即可。