1.一对一
学生表中有学号,姓名,学院
但是学生还有电话,地址等私密信息,不会放在学生表中,因此会另外一个详情信息表
此时详情信息表与学生表是一一对应的关系
主键+主键实现
create table student(
id int primary key,
name varchar(20)
);
create table studentDetails(
id int primary key,
sex varchar(20) not null,
age int,
address varchar(20) comment '家庭地址',
home_num varchar(20),
foreign key(id) references student(id)
);
comment:注释信息
被连接的为父表
添加数据
父表 --- 子表
删除数据
子表 --- 父表
查询连接
合并查询
返回的结果集字段类型和数量要保持一致
单独使用union会把两张表的数据合并,并且过滤掉相同的数据
不想过滤掉数据可以使用union all
select name,id from A uinon select * from B;
连接查询
select * from A,B;
建表
插入数据
查询
2. 一对多
当前表的非主键连接另外一张表的主键
例如:
一个学院多名学生
一名学生只能在一个学院
此时,学院与学生就是一对多关系
# 学院表
create table department(
# 学院id
d_id int primary key auto_increment,
# 学院名
d_name varchar(20) not null
);
# 创建学生表
create table student(
# 学生id
s_id int primary key auto_increment,
# 学生名
s_name varchar(20) not null,
# 所属学院的id
dept_id int not null,
foreign key(dept_id) references department(d_id)
);
insert into department values(1, '外语学院'),(2, '计算机学院');
insert into student values(1, '张三', 2),(2, '快乐', 2);
查询采用关联查询(左关联或者右关联)
3.多对多
多对多需要中间表实现
学生报名选修课
一名学生可以选择多门课程
一门课程可以有多名学生
此时;学生与课程是多对多
# 建立课程表
create table course(
cours_id int primary key auto_increment,
cours_name varchar(20) not null
);
# 学生表
create table student(
# 学生id
s_id int primary key auto_increment,
# 学生名
s_name varchar(20) not null,
);
# 选课表(中间表)
create table middle(
s_id int,
cours_id int,
primary key(s_id, cours_id),
foreign key(s_id) references student(s_id),
foreign key(cours_id) references course(cours_id)
);
insert into student values(1, '张三'),(2, '快乐');
insert into course values(1, '外语'),(2, 'python');
insert into middle values(1,2) # 关联