前言
嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的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 ***ment '主键id'
primary key,
name varchar(10) null ***ment '姓名',
age int null ***ment '年龄',
gender char null ***ment '年龄 1男 2女',
phone char(11) null ***ment '手机号'
)
***ment '用户基本信息表';
1.1.2 创建用户教育信息表
create table tb_user_edu
(
id int auto_increment ***ment '主键id'
primary key,
degree varchar(20) null ***ment '学历',
major varchar(50) null ***ment '专业',
primaryschool varchar(50) null ***ment '小学',
middleschool varchar(50) null ***ment '中学',
university varchar(50) null ***ment '大学',
userid int null ***ment '用户id',
constraint userid
unique (userid),
constraint fk_userid
foreign key (userid) references tb_user (id)
)
***ment '用户教育信息表';
1.2 一对多(多对一)
案例:部门与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现: 在多的一方建立外键,指向一的一方的主键
1.3 多对多
案例: 学生与 课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
建立三张表的代码如下
1.3.1 创建学生表且插入数据
create table student(id int auto_increment primary key ***ment'主键id',
name varchar(10) ***ment'姓名',
novar char(10) ***ment'学号') ***ment'学生表';
insert into student values(null,'宋江','001'),(null,'鲁智深','002'),(null,'李逵','001');
1.3.2 创建课程表且插入数据
create table course(
id int auto_increment primary key ***ment '主键id',
name varchar(10) ***ment'课程名称'
) ***ment'课程表';
insert into course values(null,'java'),(null,'js'),(null,'MySQL');
1.3.3 创建课程中间表且插入数据
create table student_course
(
id int auto_increment ***ment '主键'
primary key,
studentid int not null ***ment '学生id',
courseid int not null ***ment '课程id',
constraint f_kcourseid
foreign key (courseid) references course (id),
constraint f_kstudentid
foreign key (studentid) references student (id)
)
***ment '学生课程中间表';
二、多表查询概述
概述: 指从多张表中查询数据,多表查询就是要消除笛卡尔积。
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合和 B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
创建两张表:部门表、员工表
create table dept
(
id int auto_increment ***ment 'id'
primary key,
name varchar(50) not null ***ment '部门名称'
)
***ment '部门表';
create table emp
(
id int auto_increment ***ment 'id'
primary key,
name varchar(50) not null ***ment '姓名',
age int null ***ment '年龄',
job varchar(20) null ***ment '职位',
salary int null ***ment '薪水',
entrydate date null ***ment '入职时间',
mangagerid int null ***ment '直属的领导id',
dept_id int null ***ment '部门id',
constraint dept_id
foreign key (dept_id) references dept (id)
)
***ment '员工表';
两张表消除笛卡尔积的方法: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 会对合并之后的数据去重。
四、总结
今天的课程就到此结束了,今天所学的课程为多表查询的一部分,在下一期的课程中我们主要学习子查询,期待我们下次再见!