多表关系:
一对多(多对一);
例子:部门与员工的关系;
关系:一个部门对应多个员工,一个员工对应一个部门;
实现:在多的一方建立外键,指向一的一方的主键;
多对多;
例子:学生与所学课程的关系;
关系:一个学生可以选修多门课程,一门课程亦可以共多个学生选择;
实现:建立三张中间表,中间表至少包含两个外键分别关联两方主键
实现代码:在datagrip中右击界面选择可视化;
create table stu(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
no varchar(10) comment '学号'
)comment '学生表';
insert into stu values (null, 'tom','2000202020'),(null,'jluy','2000202021');
create table course(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '课程名称'
)comment '课程表';
insert into course values (null,'java'),(null,'PHP'),(null,'MYSQL');
create table stu_cour(
id int auto_increment comment '主键' primary key ,
stuid int not null comment '学生ID',
courseid int not null comment '课程ID',
constraint fk_courseid foreign key (courseid) references course(id),
constraint fk_stuseid foreign key (stuid) references stu (id)
)comment '学生课程中间表';
insert into stu_cour values (null,1,1),(null,1,2);
一对一;
案例:用户与用户详情的关系;
关系:一对一关系,用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率;
实现:在任意一方加入外键,关联另一方主键,并设置外键为唯一的(unique);
create table tb(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment'姓名',
age int comment '年龄',
gender char(1) comment'1: 男,2:女',
phone char(20)comment'手机号'
)comment '用户基本信息表';
create table tb_user1(
id int auto_increment primary key comment '主键ID',
degree varchar(28) comment '学历',
major varchar(50) comment'专业',
primaryschool varchar(50) comment'小学',
middleschool varchar(50)comment '中学',
university varchar(50) comment'大学',
userid int unique comment'用户ID',
constraint fk_userid foreign key (userid) references tb(id)//外键与唯一主键相连接
)comment '用户教育信息表';
insert into tb(id, name, age, gender, phone) values
(null,'黄渤',45,'1','188000011'),
(null,'冰冰',35,'2','188066822'),
(null,'码云',55,'1','188088888'),
(null,'李彦宏',50,'1','1880000999');
insert into tb_user1(id ,degree, major, primaryschool, middleschool, university, userid) values
(null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈','1'),
(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院','2'),
(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学','3'),
(null,'本林','应用数学','阳泉第一小学','阳泉区第一中学','清华大学','4');
多表查询:
select * from tb ,tb_user1 ;
将两个表信息的笛卡尔积形式展现出来;
1.隐式内连接;
select * from tb ,tb_user1 where tb.id=tb_user1.userid
使展现的信息以连接外键的信息,即主键值于外键值相等;
2.显式内连接
select 字段列表 from 表1 [innor] join 表2 on 连接条件...;
select * from tb t join tb_user1 u on t.id = u.userid;