Mysql之多表查询
关于Mysql的多表操作
表与表的关系
通常来说我们根据业务要求及其业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以我们将表与表的关系分为三类
- 一对一
- 一对多
- 多对多
物理外键和逻辑外键
物理外键是值使用foreign key作为外键关联另一张表的字段的连接方法
物理外键删除一条信息,如果不把外键关联的信息同步删除,数据库操作会进行报错
逻辑外键删除一条信息,对应的信息可以不删除,保留,也不会报错
-
物理外键:强调数据完整性,操作中性能消耗比较大,小数据库量推荐
-
逻辑外键:不强制对应信息,只是在代码中体现,如果代码质量不完整,删除导致的垃圾数据会越来越多,大数据库量推荐
表与表的关系实现
1.一对一
通常指的是单表对应单表
是一种特殊的一对多,我们可以在任意一方表中添加外键
SQL脚本
-- 用户基本信息表
create table tb_user(
id int unsigned primary key auto_increment comment 'ID',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 1 男 2 女',
phone char(11) comment '手机号',
degree varchar(10) comment '学历'
) comment '用户基本信息表';
-- 用户身份信息表
create table tb_user_card(
id int unsigned primary key auto_increment comment 'ID',
nationality varchar(10) not null comment '民族',
birthday date not null comment '生日',
idcard char(18) not null comment '身份证号',
issued varchar(20) not null comment '签发机关',
expire_begin date not null comment '有效期限-开始',
expire_end date comment '有效期限-结束',
user_id int unsigned not null unique comment '用户ID',
constraint fk_user_id foreign key (user_id) references tb_user(id)
) comment '用户身份信息表';
注意:在任意的一表加入外键,关联另外一表的主键,并且设置外键为唯一的 unique
2.一对多
列如一个人对应一个部门,而一个部门有很多个人,人与部门就构成了一对多的关系
- 具体实现
在一对多的表设计中,我们通常将对应 多的那张表设置外键关联另一张表的主键
3.多对多
列如一个学生有多个老师,一个老师有多个学生,n:m对应
- 具体实现
在多对多的表设计中我们我们通常会建立第三张表,中间表至少包含两个外键,分别关联两张表主键
多表查询
多表查询是指从多张表中获取所需数据
- 笛卡尔积
select * from 表1,表2;
如果我们这样查询,将会看到两表内的数据会自由组合。这种现象被称为笛卡尔积
指的是两个集合的所有组合情况
内连接
隐式内连接语法
select 字段 from 表1,表2 where 连接条件
显式内连接语法
select 字段 from 表1 join 表2 on 连接条件
注意
在多表查询的时候,如果两表有冲突相同的表名,我们通常会在字段名前面加上表名,来指定字段
外连接
外连接分为左外连接和右外连接
左外连接语法:(查询左表所有数据,包括表1和表2交集部分)
select 字段列表 from 表1 left join 表2 on 连接条件 ... ;
右外连接语法:(查询右表所有数据,包含表1和表2交集部分)
select 字段列表 from 表1 right join 表2 on 连接条件 ... ;
子查询
指的是select语句的嵌套查询,又称为子查询
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 ... );
子查询可以书写的位置
- where后
- from后(作为临时表)
- select后
插件--分页插件
在项目中,分页查询功能编写比较复杂,而分页查询的功能在项目中比较常见
分页查询的思路和步骤比较固定,在Mapper接口中定义两个方法执行两条不同的sql语句
- 查询总记录
- 指定页码的数据列表
获取的数据封装到pageBean对象中,一般为(总记录数,查询结果列表)
对于Mybatis来讲现在最主流的就是PageHelper。
依赖
<!--分页插件PageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
在sql语句中,语句正常书写
@Select("select e.*, d.name deptName from emp as e left join dept as d on e.dept_id = d.id")
但是依赖会将语句执行两遍
- 将select后替换成count()执行一遍
- 在后面拼接上limit ?,? 进行一遍

浙公网安备 33010602011771号