MYSQL基础-多表操作-事务-索引

1. 多表设计

概述

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

1. 一对多(多对一)

2. 多对多

3. 一对一

1.1 一对多

需求:根据页面原型 及 需求文档,完成部门员工模块的表结构设计。

 

 多表问题分析

现象

部门数据可以直接删除,然而还有部分员工归属于该部门下,此时就出现了数据的不完整、不一致问题。

问题分析

目前上述的两张表,在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性的。

 外键约束

语法

-- 创建表时指定
create table 表名(
	字段名 数据类型,
	...
	[constraint][外键名称] foreign key(外键字段名) references 主表(字段名)
);
-- 建完表后,添加外键
alter table 表名 add constraint 外键名称  foreign key (外键字段名) references 主表(字段名);

物理外键

概念:使用foreign key 定义外键关联另外一张表。

缺点:

影响增、删、改的效率(需要检查外键关系)。

仅用于单节点数据库,不适应于分布式、集群场景。

容易引发数据库的死锁问题,消耗性能。

逻辑外键

概念:在业务层逻辑中,解决i外键关联。

通过逻辑外键,就可以很方便的解决上述问题。

1.2 一对一

案例:用户与身份证信息 的关系

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。

实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

 多对多

案例:学生与课程的关系

关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

 2. 多表查询

概述:指从多张表中查询数据

笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时需要删除无效的笛卡尔积)

形式分类

连接查询

内连接:相当于查询A、B交集部分数据

外连接

左外连接:查询左表所有数据(包括两张表交集部分数据)

右外连接:查询右表所有数据(包括两张表交集部分数据)

子查询

2.1 内连接

语法

隐式内连接:select 字段列表 from 表1,表2 where 条件...;

显示内连接:slelect 字段列表 from 表1 [inner] join 表2 on 连接条件...;

-- 内连接
-- A. 查询员工的姓名,及所属的部门名称(隐式内连接实现)
select tb_emp.name,tb_dept.name
from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;

-- 起别名
select e.name,d.name
from tb_emp e,tb_dept d where e.dept_id = d.id;

-- B. 查询员工的姓名,及所属的部门名称(显示内连接实现)
select tb_emp.name,tb_dept.name
from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;

2.2 外连接

语法

左外连接:select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;

右外连接:select 字段列表 from 表1 right [outer] join 表2 on 连接条件...;

-- 外连接
-- A. 查询员工表所有员工的姓名,和对应的部门名称(左外连接)
select e.name,d.name
from tb_emp e left join tb_dept d on e.dept_id = d.id;
-- B. 查询部门表 所有部门的名称,和对应的员工名称(右外连接)
select e.name,d.name
from tb_emp e right join tb_dept d on e.dept_id = d.id;

2.3 子查询

概述

介绍:SQL语句中嵌套select 语句,称为嵌套查询,又称子查询。

形式:select * from te wher  coloumn1 = (select column1 from t2 ... )

子查询外部的语句可以是insert/update/delete/select 的任何一个,最常见的是select。

分类

标量子查询:子查询返回的结果为单个值

列子查询:子查询返回的结果为一列

行子查询:子查询返回的结果为一行

表子查询:子查询返回的结果为多行多列

2.3.1 标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式

常用的操作符:=   <>   >   >=   <   <= 

-- 标量子查询
-- A. 查询"教研部"的所有员工信息
select *
from tb_emp,tb_dept where (select tb_dept.id where tb_dept.name = '教研部');

-- B.查询在 方东白 入职之后的员工信息
select *
from tb_emp where entrydate > (select tb_emp.entrydate from tb_emp where name = '方东白');

2.3.2 列子查询

子查询返回的结果是一列(可以是多行)

常用的操作符:in、not in等

2.3.3 行子查询

子查询返回的结果是一行(可以是多列)。

常用的操作符:=、<>、in、not in

-- 行子查询
-- 查询与韦一笑入职日期及职位都相同的员工信息;
select *
from tb_emp where entrydate = (select entrydate from tb_emp where name = '韦一笑') and dept_id = (select dept_id from tb_emp where name = '韦一笑');

select *
from tb_emp where (entrydate,dept_id) = (select entrydate,dept_id from tb_emp where name = '韦一笑');

2.3.4 表子查询

子查询返回的结果是多行多列,常作为临时表

常用的操作符:in

3. 事务

3.1 场景

学工部 整个部门解散了,该部门及该部门下的员工都需要删除了。

操作

-- 删除学工部
delete from tb_dept where id = 1;

-- 删除学工部的员工
delete from tb_emp where dept_id = 1;

问题

如果删除部门成功了,而删除该部门的员工时失败了,就造成了数据的不一致。

3.2 介绍

事物是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

注意事项

默认MYSQL的事务是自动提交的,也就是说,当执行一条DML语句,MYSQL会立即隐式的提交事务。

3.3 操作

开启事务:start transation; / begin ;

提交事务:commit;

回滚事务:rollback;

-- 事务
-- 开启事务
start transaction ;
-- 删除部门
delete from tb_dept where id = 3;
-- 删除部门下的员工
delete from tb_emp where dept_id = 3;
-- 提交事务
commit ;
-- 回滚事务
rollback ;

3.4 事务的四大特性

1. 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败

2. 一致性:事务完成时,必须使所有的数据都保持一致状态

3. 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

4. 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

4. 索引

4.1 介绍

概念:索引(index) 是帮助数据库 高效获取数据 的 数据结构。

4.2 优缺点

优点:

提高数据查询的效率,降低数据库的IO成本

通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗

缺点:

索引会占用存储空间

索引大大提高了查询效率,同时却也降低了insert、update、delete的效率。

4.3 结构

MYSQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。

 B+Tree(多路平衡搜索树)

 注意事项:

每一个节点,可以存储多个key(有n个key,就有n个指针)。

所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。

叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。

4.4 语法

创建索引

create [unique] index 索引名 on 表名 (字段名,...);

查看索引

show index from 表名;

删除索引

drop index 索引名 on 表名;

-- 索引
-- 创建:为tb_emp 表的name字段建立一个索引
create index idx_emp_name on tb_emp(name);
-- 查询tb_emp 表的索引信息
show index in tb_emp;
-- 删除tb_emp表中name字段的索引
drop index idx_emp_name on tb_emp;

注意事项

主键字段,在建表时,会自动创建主键索引。

添加唯一约束时,数据库实际上会添加唯一索引。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/877400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络编程基础概述

文章目录 协议网络协议栈(osi)局域网IPIP和Mac地址端口号TCP和UDP网络字节序 协议 (网络协议的)意义:为了让计算机传输之间将信息正确传输给目标机器 不同系统之间能接入网络是因为定制了一套通用的协议以便支持不同系统间的网络通信 1.网络通信的问题: 将数据可靠的从A传给B a…

Cesium 计算3d凸包(ConvexHull)

Cesium 计算3d凸包(ConvexHull) Cesium 计算3d凸包(ConvexHull)

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

InputDispatcher的调试日志isLoggable动态开放logcat实战使用

背景&#xff1a; 在学习input专题课程后&#xff0c;那么就可以正常对所有和input相关的问题进行分析&#xff0c;经常分析的类就是InputDispatcher&#xff0c;平时如果看正常的logcat输出&#xff0c;发现InputDispatcher相关的日志非常少&#xff0c;基本上没办法进行有价…

用Python打造互动式中秋节庆祝小程序

中秋节&#xff0c;这个充满传统韵味的节日&#xff0c;不仅是家人团聚的时刻&#xff0c;也是程序员展示创意的好机会。本文将引导您使用Python创建一个互动式中秋节庆祝小程序&#xff0c;它不仅能够展示节日祝福&#xff0c;还能通过一些简单的特效增加节日气氛。 文章目录 …

TCP socket

TCP的socket和UDP大同小异&#xff0c;基本的代码结构都是相同的。一些相同的接口本文就不赘述了&#xff0c;例如&#xff0c;socket,bind&#xff0c;有需要看这篇文章UDP socket 服务端server 两步&#xff1a;初始化服务端&#xff0c;运行服务端 初始化服务端 创建soc…

ML4T:把机器学习驱动交易做成标准的pipeline(流)的​模式

原创内容第652篇&#xff0c;专注量化投资、个人成长与财富自由。 量化的刚需是策略&#xff0c;策略的核心是因子。 ML4T&#xff08;Machine Learning for Trading&#xff09;&#xff0c;把机器学习驱动交易做成标准的pipeline(流)的模式。 对于机器而言&#xff0c;多数…

JDBC API详解一

DriverManager 驱动管理类&#xff0c;作用&#xff1a;1&#xff0c;注册驱动&#xff1b;2&#xff0c;获取数据库连接 1&#xff0c;注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 查看Driver类源码 static{try{DriverManager.registerDriver(newDrive…

【目标检测数据集】锯子数据集1107张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1107 标注数量(xml文件个数)&#xff1a;1107 标注数量(txt文件个数)&#xff1a;1107 标注…

AI donotpay平台介绍

AI donotpay平台介绍 DoNotPay 是一个基于人工智能的在线法律服务平台&#xff0c;旨在帮助用户解决与大公司和政府机构的各种问题。以下是对 DoNotPay 平台的详细介绍&#xff1a; 1. 平台概述 创始人: DoNotPay 由 Joshua Browder 于 2015 年创立&#xff0c;最初是一个用于…

店群合一模式下的社区团购新发展——结合链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序源码

摘要&#xff1a;本文探讨了店群合一的社区团购平台在当今商业环境中的重要性和优势。通过分析店群合一模式如何将互联网社群与线下终端紧密结合&#xff0c;阐述了链动 21 模式、AI 智能名片和 S2B2C 商城小程序源码在这一模式中的应用价值。这些创新元素的结合为社区团购带来…

【0基础】制作HTML网页小游戏——贪吃蛇(附详细解析)

我在昨天的文章&#xff08;贪吃蛇HTML源码&#xff09;里面分享了网页版贪吃蛇小游戏的源码&#xff0c;今天就来给大家详细讲解一下每部分代码是如何运作的&#xff0c;以及以后要如何美化贪吃蛇的UI界面&#xff0c;在哪里修改等。 目录 一、代码运作 1、HTML结构: 2、C…

【有啥问啥】深入浅出马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)算法

深入浅出马尔可夫链蒙特卡罗&#xff08;Markov Chain Monte Carlo, MCMC&#xff09;算法 0. 引言 Markov Chain Monte Carlo&#xff08;MCMC&#xff09;是一类用于从复杂分布中采样的强大算法&#xff0c;特别是在难以直接计算分布的情况下。它广泛应用于统计学、机器学习…

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS&#xff0c;官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本&#xff1a;rtems-5.3 版本&#xff0c; 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的&#xff0c;当前支持 STM32F4…

CSS 响应式设计(补充)——WEB开发系列36

随着移动设备的普及&#xff0c;网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示&#xff0c;还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前&#xff0c;网页布局通常是固定的或流动的。固定布局使用固定…

PMP–一、二、三模–分类–14.敏捷–技巧–项目生命周期

文章目录 技巧项目生命周期 一模14.敏捷--项目生命周期--原型法--迭代型生命周期&#xff0c;通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈&#xff0c;因此原型法比较好用。23、 [单选] 一个敏捷团队…

异常冲突行为和危险识别系统源码分享

异常冲突行为和危险识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…

Github 2024-09-16 开源项目周报 Top14

根据Github Trendings的统计,本周(2024-09-16统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目2Go项目2JavaScript项目2Shell项目2Rust项目2C++项目2Jupyter Notebook项目1C#项目1React: 用于构建用户界面的JavaS…

linux第二课(docker的安装使用)

目录 一.关于docker (1)背景引入 (2)docker介绍 (3)功能 (4)Docker架构 二.docker的安装及相关的命令 (1)docker的安装 (2)docker的配置 (3)docker镜像命令 (4)容器命令 三.docker安装myaql ​编辑 四.数据卷挂载 1.数据卷挂载引入 2.数据卷挂载图解 3.数据卷的安装…

1. 运动控制指令概要(omron 机器自动化控制器)

机器自动化控制器——第一章 运动控制指令概要 1-1 运动控制指令PLCopen运动控制用功能块运动控制指令概要▶ 运动控制指令的种类▶ 状态变化▶ 运动控制指令的启动和状态▶ 异常处理▶ 执行运动控制指令时输入变量的变更(指令重启)▶ 通过选择缓存模式执行指令多重启动▶ 通过…