> 文档中心 > mysql--多表查询

mysql--多表查询


?个人简介

⭐️个人主页:摸鱼の文酱博客主页?‍♂️
?博客领域:java编程基础,mysql
?写作风格:干货,干货,还是tmd的干货
?精选专栏:【Java】【mysql】 【算法刷题笔记】
?博主的码云gitee,平常博主写的程序代码都在里面。
?支持博主:点赞?、收藏⭐、留言?
?作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

文章目录

  • ?前言
  • ?多表关联关系分类
    • ?一对一关系
      • ==?主键共享,对两张表建立外键约束==
      • ==?子表添加一个新的字段并给该字段添加唯一约束和外键约束,然后关联父表主键字段。==
    • ?一对多关系
      • ==?外键添加在多的一方,关联一的主键==
    • ?多对多关系:
      • ==?创建一个中间表,中间表的两个普通字段分别关联另两张表的主键==

?前言

  上一章我们对mysql数据库中表的增删查改等操作做了介绍,但那只是对一张表的操作.现实生活中,很多情况下,仅仅一张表中的内容并不能解决我们遇到的问题.
例如:

  学校有两张表,一张是班级表,另一张是学生信息表.现在要问的是如何能够让学生与他所在班级相对应.

mysql--多表查询

mysql--多表查询
显然,当我们所需要的信息储存在两张甚至更多张表中时,之前我们学过的那些操作并不能帮我们完成这个操作.这时,就涉及到了多表关联关系

?多表关联关系分类

不论是生活中,还是抽象出来的软件中,描述生活中的多个类型之间的关系,总结如下:

  1. 一对一关系
  2. 一对多关系、多对一关系
  3. 多对多关系

?一对一关系

  对象与对象之间一一对应.最容易想到的就是人的身份证,一个人只能有一个身份证号码.
我们可以

?主键共享,对两张表建立外键约束

示例:

我们就拿人的姓名和身份证号码的例子

mysql> create table person(pid int primary key auto_increment comment '编号',    -> pname varchar(20) not null comment '姓名');mysql> create table Idnumber(Iid int primary key auto_increment comment '编号',    -> Inumber varchar(20) not null comment '身份证号',    ->  foreign key(Iid) references person(pid));mysql> insert into person values(1,"张三");Query OK, 1 row affected (0.00 sec)mysql> insert into person values("李四");ERROR 1136 (21S01): Column count doesn't match value count at row 1mysql> insert into person values(2,"李四");Query OK, 1 row affected (0.00 sec)mysql> insert into Idnumber values(1,"1543415");Query OK, 1 row affected (0.00 sec)mysql> insert into Idnumber values(2,"8764534353");Query OK, 1 row affected (0.00 sec)mysql> insert into Idnumber values(3,"6468452435");ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`person`.`idnumber`, CONSTRAINT `idnumber_ibfk_1` FOREIGN KEY (`Iid`) REFERENCES `person` (`pid`))

可以看得出来,Idnumber表中添加数据时,要与person表中的数据一一对应,不能比person表中的数据量多
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

?子表添加一个新的字段并给该字段添加唯一约束和外键约束,然后关联父表主键字段。

mysql> create table id(id int primary key auto_increment, number varchar(20) not null,    -> person_id int unique, foreign key (person_id) references person(pid));mysql> insert into id values(1,'41616456',2);mysql> insert into id values(2,'8745146456',1);  -- 可以不按顺序插入,编号对应即可

在这里插入图片描述

?一对多关系

?外键添加在多的一方,关联一的主键

示例:

文章开头我们提到过的学生和班级的关系,一个学生只能存在一个班级中,一个班级有多个学生.

mysql> create table course(id int primary key auto_increment,    -> cname varchar(50) not null, score int default 0,    -> sid int,foreign key (sid) references stu(id));mysql> insert into stu (sname) values('张三');mysql> insert into course(cname,score,sid) values('math',98,1);mysql> insert into course(cname,score,sid) values('chinese',99,1);mysql>  insert into course(cname,score,sid) values('english',111,1);mysql> select * from course;

mysql--多表查询

?多对多关系:

  多对多关系是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

?创建一个中间表,中间表的两个普通字段分别关联另两张表的主键

示例:
学生和课程之间的关系
在这里插入图片描述

-- 创建课程表CREATE TABLE course (id INT PRIMARY KEY auto_increment,name VARCHAR(20));-- 创建学生课程中间表,考试成绩表CREATE TABLE score (id INT PRIMARY KEY auto_increment,score DECIMAL(3, 1),student_id int,course_id int,FOREIGN KEY (student_id) REFERENCES student(id),FOREIGN KEY (course_id) REFERENCES course(id));

在这里插入图片描述