前言
嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的MySQL数据库的各种操作都是在一张表之中,今天我们学习要对多张表进行相关操作,相比较于单一的表来说,多张表操作相对复杂一些,我相信只要认真学习多表查询也不再话下!
目录
目录
前言
目录
一、多表关系
1.概述
1.1 一对一
1.2 一对多(多对一)
1.3 多对多
二、多表查询概述
三、多表查询分类
3.1 连接查询
3.2 内连接语法
3.3 内连接练习
3.4外连接语法
3.5 外连接练习
3.6 自连接语法
3.7 联合查询 union,union all
四、总结
一、多表关系
1.概述
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
一对一(多对一)
一对多
多对多
1.1 一对一
案例: 用户与 用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
1.1.1 创建用户基本信息
create table tb_user(id int auto_increment comment '主键id'primary key,name varchar(10) null comment '姓名',ageint null comment '年龄',gender charnull comment '年龄 1男 2女',phonechar(11)null comment '手机号')comment '用户基本信息表';
1.1.2 创建用户教育信息表
create table tb_user_edu(idint auto_increment comment '主键id'primary key,degreevarchar(20) null comment '学历',major varchar(50) null comment '专业',primaryschool varchar(50) null comment '小学',middleschoolvarchar(50) null comment '中学',universityvarchar(50) null comment '大学',useridint null comment '用户id',constraint useridunique (userid),constraint fk_useridforeign key (userid) references tb_user (id))comment '用户教育信息表';
1.2 一对多(多对一)
案例:部门与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现: 在多的一方建立外键,指向一的一方的主键
1.3 多对多
案例: 学生与 课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
建立三张表的代码如下
1.3.1 创建学生表且插入数据
create table student(id int auto_increment primary key comment'主键id',name varchar(10) comment'姓名',novar char(10) comment'学号') comment'学生表';insert into student values(null,'宋江','001'),(null,'鲁智深','002'),(null,'李逵','001');
1.3.2 创建课程表且插入数据
create table course(id int auto_increment primary key comment '主键id',name varchar(10) comment'课程名称') comment'课程表';insert into course values(null,'java'),(null,'js'),(null,'MySQL');
1.3.3 创建课程中间表且插入数据
create table student_course(idint auto_increment comment '主键'primary key,studentid int not null comment '学生id',courseidint not null comment '课程id',constraint f_kcourseidforeign key (courseid) references course (id),constraint f_kstudentidforeign key (studentid) references student (id))comment '学生课程中间表';
二、多表查询概述
概述: 指从多张表中查询数据,多表查询就是要消除笛卡尔积。
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合和 B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
创建两张表:部门表、员工表
create table dept(id int auto_increment comment 'id'primary key,name varchar(50) not null comment '部门名称')comment '部门表';
create table emp(id int auto_increment comment 'id'primary key,name varchar(50) not null comment '姓名',ageint null comment '年龄',jobvarchar(20) null comment '职位',salary int null comment '薪水',entrydatedatenull comment '入职时间',mangagerid int null comment '直属的领导id',dept_idint null comment '部门id',constraint dept_idforeign key (dept_id) references dept (id))comment '员工表';
两张表消除笛卡尔积的方法:emp.dept_id=dept.id
三、多表查询分类
3.1 连接查询
内连接:相当于查询A、B交集部分数据。
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据 。
右外连接:查询右表所有数据,以及两张表交集部分数据。自连接:当前表与自身的连接查询,自连接必须使用表别名。
3.2 内连接语法
3.2.1隐式内连接
select 字段名 from 表1,表2 where 条件....;
3.2.2 显式内连接
select 字段名 from 表1 [inner] join 表2 no 连接条件;
内连接是两张表交集的部分
3.3 内连接练习
3.3.1 查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;
3.3.2 查询每一个员工的姓名,及关联的部门的名称(显示内连接实现)
select emp.name,dept.name from emp join dept on emp.dept_id=dept.id;
3.4外连接语法
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件...;
相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据
3.5 外连接练习
连接条件:emp.id=dept.id
3.5.1 查询emp表的所有数据,和对应部门信息(左外连接)
select e.*,d.name from emp e left outer join dept d on e.dept_id=d.id;
3.5.2 查询dept表的所有数据,和对应的员工信息(右外连接)
select d.*,e.* from emp e right outer join dept d on e.dept_id=d.id;
右连接可以改为左连接
select d.*,e.* from dept d left outer join emp e on e.dept_id=d.id;
3.6 自连接语法
select 字段列表 from 表A 别名A join 表B 别名B on 条件;
子连接查询,可以是内连接查询,也可以是外连接查询。
3.7 联合查询 union,union all
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
union 语法
SELECT 字段列表 FROM 表A ....UNION [ ALL]SELECT 字段列表 FROM 表B ....;
注意:
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
四、总结
今天的课程就到此结束了,今天所学的课程为多表查询的一部分,在下一期的课程中我们主要学习子查询,期待我们下次再见!