数据库表结构设计和查询---多表

本文介绍了数据库中的多表设计,包括一对多、一对一和多对多关系的实现,以及如何通过物理外键来建立关联。讨论了SQL语句添加物理外键的方法和IDEA中的图形化工具设置。此外,详细阐述了不同类型的查询,如内连接、外连接和子查询的使用,以及在实际案例中的应用。最后,概述了事务的基本操作和四大特性,强调了事务在确保数据完整性中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多表设计

一对多

简介

在这里插入图片描述
一个表的某个字段,对应一个表
父表 子表

物理外键

需求分析

在这里插入图片描述

sql语句添加物理外键

在这里插入图片描述
设置物理外键的sql语句

为子表设置物理外键,关联父表主键

idea图形化工具设置外键

在这里插入图片描述
仍然是modify table ,图形化来修改表的字段
在这里插入图片描述
删除物理外键,仍然是从modify table删除外键

一对一

在这里插入图片描述
任意选一个表设置外键,关联对方主键,即可实现一对一

多对多

在这里插入图片描述
对于多对多,需要建立第三张表,第三张表中,设置一个id,两个外键,分别关联两方主键,从而实现数据库层的联系

多表查询

简介

针对于多张表有联系的查询
在这里插入图片描述

在这里插入图片描述
如果不加任何条件。直接进行查询, 那么就会产生无效的笛卡尔积,就像下图
在这里插入图片描述
所以可以加上条件,消除无效的笛卡尔积

这里所加的条件,就是所谓的逻辑外键

在这里插入图片描述

内连接查询

在这里插入图片描述
刚刚在简介部分就是使用隐式内连接

具体代码
在这里插入图片描述
第一行代码解释:在where之后,为了区分,在每个键的前面加上了 “表名+.” ,而且前面查询内容也用表名提前区分

第二行代码解释:可以在from后对表起一个别名,之后在设置条件以及查询时,都要用别名代替表名来区分

外连接查询(一般用于需求里面有“空”类似的意思的需求)

在这里插入图片描述
格式与上面显性内连接差不多

select 字段 from 表1 join 表2 on 连接条件
将表一与表二连接

如果是左连接,加个left ,那么会包含左边表中不是交集的部分
右连接同理,

但是左右连接取决于表的位置,所以 右连接可以被替换为左连接
(如以下第三行)
在这里插入图片描述

子查询

简介以及分类

在这里插入图片描述

标量子查询

在这里插入图片描述
例子
在这里插入图片描述
这里要先查询出来部门的id 之后拿着这个id去查员工信息

可以利用一个子查询结合起来
在这里插入图片描述

例子2
在这里插入图片描述
图中光标高亮的部分,就是所谓的子查询,该子查询的结果,是一个单行单列的值,所以,叫做标量子查询

列子查询

在这里插入图片描述

之所以叫列子查询,是因为(见下图),光标高亮的部分就是所谓的子查询,该部分查询的结果是一列数据,所以叫列子查询
在这里插入图片描述

例子

在这里插入图片描述
上面可以优化为下面这样
在这里插入图片描述

行子查询

在这里插入图片描述
例子

优化前:
在这里插入图片描述
优化后
在这里插入图片描述
这里注意格式需要改变一下,改成(xxx,xxx,xxx,…)=(查询语句)

表子查询

在这里插入图片描述
例子
在这里插入图片描述
图中光标高亮的部分,实际上就是第一行代码,将第一行代码括起来 起个别名 就可以当作一张临时表使用,之后采用内连接,完成需求

案例

案例1
在这里插入图片描述

分析需求时,首先要先明确涉及哪些表

再看所查询的需求是否涉及到多张表的联系,考虑是否需要用到内连接,大部分情况下需要

之后根据需求写语句

这里注意,要想查询“各个大类下的xxx数据”,要用分组查询,如上图

案例2
在这里插入图片描述
当三个表需要建立内连接时,直接建立即可,连接条件用and连接

总结

在这里插入图片描述

事务

简介

在这里插入图片描述

基本操作

在这里插入图片描述

在这里插入图片描述
手动进行事务的打包
首先开启事务
之后执行,如果都成功,那么执行手动commit,只有执行了commit,数据库才会更新

如果有一处失败,那么手动执行rollback,这样虽然事务执行完毕,但是因为还没有执行commit,那么数据库还不会更新,就不会导致数据库的不完整

四大特性

在这里插入图片描述

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值