一个简单的示例,让你学会 MySQL一对多和多对多的建表与查询

一对多

我们每个人和自己的书就是一对多的关系,当然在这里我们认为书是私有的,属于个人财产。

image-20211105150814963

于是我们建立person表和book

1
2
3
4
5
6
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` INT NOT NULL AUTO_INCREMENT,
`person_name` VARCHAR(16) DEFAULT NULL UNIQUE,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
1
2
3
4
5
6
7
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` INT NOT NULL AUTO_INCREMENT,
`book_name` VARCHAR(50) DEFAULT NULL UNIQUE,
`person_id` INT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

插入测试值

1
2
3
4
5
6
7
8
9
INSERT INTO `person`
VALUES (1,'Tom'),
(2,'Bob');

INSERT INTO `book`
VALUES (1,'JAVA从入门到入土',1),
(2,'WEB渗透从入门到入狱',1),
(3,'数据结构与算法',2),
(4,'平凡的世界',1);

通过在book表中创建的person_id字段,我们很容易通过连接表查询到个人与书籍的对应情况:

image-20211105144733375

多对多

学生每天都要上课,而学生与课程之间的关系就是多对多的关系

一个学生要上好几门课,而每门课也会被多个学生上(额…好像有点奇怪)

因此我们需要建立三张表,其中有一张用来联系另外两张表

image-20211105151515355

建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` INT NOT NULL AUTO_INCREMENT,
`student_name` VARCHAR(12) DEFAULT NULL UNIQUE,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` INT NOT NULL AUTO_INCREMENT,
`course_name` VARCHAR(30) DEFAULT NULL UNIQUE,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
`student_id` INT NOT NULL,
`course_id` INT NOT NULL,
PRIMARY KEY (`student_id`,`course_id`),
FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`course_id`) REFERENCES `course` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT INTO `student`
VALUES (1,'Tom'),
(2,'Bob');

INSERT INTO `course`
VALUES (1,'JAVA程序设计'),
(2,'大学物理'),
(3,'数据结构与算法'),
(4,'C++面向对象程序设计');

INSERT INTO `student_course`
VALUES (1,1),
(1,3),
(1,4),
(2,2),
(2,4);

连接查询每个学生要上哪些课以及每门课被哪些学生上:thinking:

image-20211105155428928

image-20211105160607332

OK,完结撒花