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.rhkb.cn/news/424817.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3时间模块使用

文章目录 python安装时间处理模块概述time 模块常用方法 datetime 模块常用方法 时间戳与 datetime 的相互转换时区处理使用 pytz 设置时区 实际应用场景日志时间处理时间差计算不同时区的时间转换 结论 在 Python 编程中&#xff0c;时间处理和时间格式转换是非常常见的需求&a…

美团图床设置教程

大厂图床&#xff0c;CDN加速 项目地址&#xff1a;https://github.com/woniu336/mt-img 使用方法 在mt.php填上你的token即可&#xff0c;然后打开index.html上传图片 获取token方法 注册https://czz.meituan.com/发布视频&#xff0c;上传封面&#xff0c;注意在上传封面后…

【退役之再次线上部署】Spring Boot + VUE + Nginx + MySQL

这篇博客写在凌晨 4 点 20 分&#xff0c;这个时候我刚线上部署完成 web 项目&#xff0c;自己写的全栈项目 这个点儿&#xff0c;也睡不着了&#xff0c;索性就写篇博客记录一下 一、踩坑实录 这个是 最重要的&#xff0c;所以写在前面 Nginx 配置文件 location location /a…

【更新】上市公司-供应链金融水平数据(2000-2023年)

上市公司供应链金融是指上市公司利用其产业链核心地位&#xff0c;通过整合金融资源&#xff0c;为供应链上下游企业提供包括融资、结算、风险管理等在内的综合金融服务。为了衡量上市公司的供应链金融水平&#xff0c;参考周兰等&#xff08;2022&#xff09;的研究方法&#…

基于Spring Boot的心理健康服务系统的设计与实现(毕业论文)

目    录 1 前言 1 1.1 研究目的与意义 1 1.2 国内外研究现状 1 1.3 论文结构 3 2 可行性分析 3 3 系统需求分析 4 3.1 用户需求分析 4 3.2 心理咨询师需求分析 5 3.3 管理员需求分析 6 3.4 业务流程分析 7 4 概要设计 9 4.1 系统结构设计 10 4.2 功能模块设计 10 4.2.1 管…

20Kg载重30分钟续航多旋翼无人机技术详解

一、机架与结构设计 1. 材料选择&#xff1a;为了确保无人机能够承载20Kg的负载&#xff0c;同时实现30分钟的续航&#xff0c;其机架材料需选用轻质高强度的材料&#xff0c;如碳纤维或铝合金。这些材料不仅具有良好的承重能力&#xff0c;还能有效减轻无人机的整体重量&…

计算机毕业设计Python深度学习垃圾邮件分类检测系统 朴素贝叶斯算法 机器学习 人工智能 数据可视化 大数据毕业设计 Python爬虫 知识图谱 文本分类

基于朴素贝叶斯的邮件分类系统设计 摘要&#xff1a;为了解决垃圾邮件导致邮件通信质量被污染、占用邮箱存储空间、伪装正常邮件进行钓鱼或诈骗以及邮件分类问题。应用Python、Sklearn、Echarts技术和Flask、Lay-UI框架&#xff0c;使用MySQL作为系统数据库&#xff0c;设计并实…

Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)

前言 公司主要使用 Go 语言做项目&#xff0c;有一些 Gitlab 私有仓库需要引用&#xff0c;在做 CI 时&#xff0c;要自行配置权限以获取代码。 最近发现各个项目组在做 CI 遇到仓库权限问题时的解决方式不尽相同&#xff0c;有用 Project Token 的&#xff0c;有用 Deploy K…

unity3d入门教程五

unity3d入门教程五 13鼠标事件处理13.2鼠标跟随13.3鼠标拖拽&#xff08;选中对象&#xff0c;拖动对象&#xff09;13.4几个问题14.1事件函数14.2脚本的执行顺序14.3脚本的参数14.4引用类型的参数&#xff08;进行图片更换&#xff0c;人物换装&#xff09; 13鼠标事件处理 需…

自由流转--实例

一、自由流转的形态 流转能力打破设备界限&#xff0c;多设备联动&#xff0c;使用户应用程序可分可合、可流转&#xff0c;实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。 二、跨端迁移 在应用开发层面&#xff0c;跨端迁移指在A端运行的UIAbility迁移到B端上…

Linux操作系统如何添加新字体

在一个Linux操作系统及办公软件刚安装后&#xff0c;会发现缺少常用的“楷体_GB2312”和“仿宋_GB2312”字体。此时&#xff0c;只需要从其它电脑复制到或者从互联网上下载到这两个字体文件&#xff0c;然后导入到自己的电脑即可&#xff0c;再次打开办公软件就会看到这个字体已…

linux重要文件

/etc/sysconfig/network-scripts/ifcfg-eth1 网卡重启 /etc/init.d/network restart ifup ethname & ifdown ethname /etc/resolv.conf 设置Linux本地的客户端DNS的配置文件 linux客户端DNS可以在网卡配置文件(/etc/sysconfig/network/ifcfg-eth0 DNS2)里配置 也可以在/et…

FL Studio 24.1.1.4285中文破解完整版免费下载FL 2024注册密钥完整版crack百度云安装包下载

FL Studio 24.1.1.4285中文破解版是一个强大的软件选项&#xff0c;可以使用专业应用程序&#xff08;如最先进的录音机、均衡器、内置工具等&#xff09;制作循环和歌曲。它由数百个合成器和混响等效果以及均衡器组成&#xff0c;除此之外&#xff0c;您还可以在新音乐制作的方…

9. 什么是 Beam Search?深入理解模型生成策略

是不是总感觉很熟悉&#xff1f; 在之前第5&#xff0c;7&#xff0c;8篇文章中&#xff0c;我们都曾经用到过与它相关的参数&#xff0c;而对于早就有着实操经验的同学们&#xff0c;想必见到的更多。这篇文章将从示例到数学原理和代码带你进行理解。 Beam Search 对应的中文翻…

【C++】queue和priority_queue

个人主页~ queue和priority_queue 一、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现 二、priority_queue的介绍和使用1、priority_queue的介绍2、priority_queue的使用3、priority_queue的模拟实现 三、仿函数1、仿函数的特征2、仿函数的使用 ex、有关于l…

2020-11-04 求最小与均值输入0结束

缘由编写c语言希望进行一些解释_编程语言-CSDN问答 void 求最小与均值输入0结束() {//缘由https://ask.csdn.net/questions/1102407int x 1, m INT_MAX, n 0, c 0;while (x)cin >> x, (x&&m > x ? m x : 0), n x, (x ? c : 0);cout << "最…

【智路】智路OS air-edge 开发者手册 包管理工具

包管理工具 https://airos-edge.readthedocs.io/zh/latest/airospkg/airospkg.html 功能概述 智路OS包支持部署在智路OS开源版本和智路OS发行版。 智路OS发行版&#xff08;airos distribution&#xff09;是基于智路OS的商业化版本。包括智路OS内核层、系统工具、库、软件…

WPS如何删除表格下的空白页

WPS Office&#xff08;12.1.0.17827&#xff09; ① 鼠标右键&#xff0c;选择段落 ② 行距&#xff1a;固定值&#xff1b;设置值&#xff1a;1磅&#xff1b;取消勾选&#xff0c;确定即可~

Qt与Udp

(1)绑定端口 (2)广播 用udp实现广播通信_udp广播-CSDN博客 数据的发送是面向整个子网的&#xff0c;任何一台在子网中的计算机都可以接收到相同的数据。 如果一台机器希望向其他N台机器发送信息&#xff0c;这时候可以使用UDP的广播。 --------------- 广播地址&#xff1…

《论层次架构及其在软件系统中的应用》写作框架,软考高级系统架构设计师

论文真题 层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架构的理解和应用是软件工程师必备的技能之一…