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

news2024/11/15 20:14:53

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.coloradmin.cn/o/2139215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算服务的底层,虚拟化技术的实现原理

虚拟化技术&#xff1a; 一、 从cpu说起&#xff0c; intel和amd等cpu制造商 为了提高其cpu对 虚拟化程序的运算速度&#xff0c; 给cpu硬件里面 增加了指令集 VMLAUNCH, VMRESUME, VMEXIT, VMXOFF 这些指令集称为硬件辅助虚拟化技术的指令集。 ---------------------…

探索Python的Excel世界:openpyxl的魔法之旅

文章目录 探索Python的Excel世界&#xff1a;openpyxl的魔法之旅背景&#xff1a;为什么选择openpyxl&#xff1f;什么是openpyxl&#xff1f;如何安装openpyxl&#xff1f;简单的库函数使用方法场景应用&#xff1a;openpyxl在实际工作中的应用常见bug及解决方案总结 探索Pyth…

倒序循环(一)

题目描述 输入一个正整数n&#xff0c;输出从 n~ 1 递减的序列。 输入格式 一行一个整数 n 输出格式 n 行&#xff0c;每行一个符合题目要求的整数 样例数据 样例输入#1 5样例输出#1 5 4 3 2 1样例输入#2 6样例输出#2 6 5 4 3 2 1数据范围 对于100%的数据&#xff…

(c++)用取模符%、除运算判断是否是某个数的倍数,判断个位十位是否有某个数

结果易懂&#xff0c;但凡和7有关&#xff0c;都输出相应的关系。关系分为三种&#xff0c;7的倍数&#xff0c;十位是7&#xff0c;个位是7 #include<iostream>using namespace std;int main() {for (int num 1; num < 100; num){if (num % 7 0)//是7的倍数{cout …

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…

git快熟

Git版本控制 内容背景集中式与分布式版本控制安装git代码托管服务Git必要配置公钥和私钥注册gitee配置ssh公钥实现远程仓库与本地仓库免密登录git常用命令git|全局设置获取git仓库工作区&#xff0c;暂存区&#xff0c;版本库 概念本地仓库操作远程仓库提交git分支操作idea集成…

<Linux> 进程间通信

目录 一、进程间通信介绍 1. 进程间通信概念 2. 进程间通信目的 3. 进程间通信的本质 4. 进程间通信发展 5. 进程间通信分类 管道&#xff08;文件缓冲区&#xff09; System V IPC POSIX IPC 二、管道 1. 匿名管道 1.1 匿名管道原理 1.2 pipe系统调用 1.3 匿名管道的使用 1.4…

vue3 透传 Attributes

前言 Vue 3 现在正式支持了多根节点的组件&#xff0c;也就是片段&#xff01; Vue 2.x 遵循单根节点组件的规则&#xff0c;即一个组件的模板必须有且仅有一个根元素。 为了满足单根节点的要求&#xff0c;开发者会将原本多根节点的内容包裹在一个<div>元素中&#x…

【MySQL】基础部分——DDL,DML,DQL,DCL,函数,约束,多表查询,事务

个人学习记录&#xff0c;供以后回顾和复习 ubuntu下安装使用1.DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCLDDL数据库表 DML增改删 DQL条件查询分组查询排序查询分页查询 DCL管理用户权限控制 2.函数字符串函数数值函数日期函数流程函数 3.约束4.多表查询多表关系内连接…

学习大数据DAY58 增量抽取数据表

作业 1 SQL 优化的常见写法有哪些 - 面试经常被问 使用索引&#xff1a;合理创建和使用索引是提高查询效率的关键。索引可以加速数据的检 索速度&#xff0c;但是索引也会占用额外的存储空间&#xff0c;并且在插入、删除和更新操作时会 有额外的开销。 避免全表扫描&…

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Linux命令分享 四 (ubuntu 16.04)(vi操作文件)

1、su 切换用户 su - 用户名 切换到该用户并将目录切换至该用户的主目录 **注意该语句执行后需要输入密码&#xff0c;输入密码时终端不回显&#xff08;不会显示你输入的密码&#xff09;&#xff0c;输完直接回车即可 su 用户名 切换用户但不切换目录 su - root su root **注…

你可能遗漏的一些C#/.NET/.NET Core知识点

前言 在这个快速发展的技术世界中&#xff0c;时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节&#xff0c;以帮助大家更全面地了解这些技术栈的特性和发展方向。 拾遗补漏Git…

NISP 一级 | 5.3 电子邮件安全

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;电子邮件安全威胁 电子邮件&#xff08;Electronic mail&#xff0c;Email&#xff09;是一种用电子手段提供信息交换的服务方式&#xff0c;是因特网上应用最为广泛的服务之一。…

【原创 架构设计】多级缓存的应用、常见问题与解决方式

1. 简介 多级缓存是一种常见的性能优化手段&#xff0c;对于多级缓存一般意义上的理解具体主要实现其实指的就是本地缓存和分布式缓存。 本地缓存一般采用Caffeine或者Guava Cache来进行实现&#xff0c;而分布式缓存一般采用Redis来进行实现。 2. 业务流程 业务线程先在本…

聚类_K均值

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs1.数据预处理 #创建基于高斯分布的样本点, x是点的坐标&#xff0c;y是所属聚类值 x, y make_blobs(n_samples100, centers6, random_state100, cluster_std0.6) # 设置图形尺寸…

整数在内存中的存储原码反码补码

目录 1.整数在内存中以二进制的形式存在 1.1&#xff08;正数存储情况&#xff09; 1.2 负数存储情况 1.3整数的补码如何得到原码 2.无符号整数的原反补码 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&am…

Linux网络——守护进程、会话、进程组

文章目录 会话守护进程编写守护进程的注意事项编写样例 会话 会话是session&#xff0c;代表的是客户端与服务器的一次交互过程&#xff0c;我们可以简单理解为&#xff0c;当我们打开一个终端&#xff0c;在用户登录时&#xff0c;就是创建了一个会话 一般来说会话都与各自的…

62. 不同路径、64. 最小路径和

思路 dp&#xff1a;代表到达当前位置的总方式 初始化&#xff1a;第一行的位置dp[0][j]&#xff1a;当前位置只能由左边的位置向右移动得到 所以只有1种方式 d[0][j]1, d[0][0]1 第一列的位置 dp[i][0]&#xff1a;当前位置只能由上一个位置向下移动得到 除此之外的位置可以由…

python画图|同时输出二维和三维图

前面已经学习了如何输出二维图和三维图&#xff0c;部分文章详见下述链接&#xff1a; python画图|极坐标下的3D surface-CSDN博客 python画图|垂线标记系列_如何用pyplot画垂直x轴的线-CSDN博客 有时候也需要同时输出二位和三维图&#xff0c;因此有必要学习一下。 【1】…