MySQL从0到1基础语法笔记(下)

news2024/11/17 4:22:40
  • 博客主页:誓则盟约
  • 系列专栏:Java Web
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

多表问题分析:

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

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

 通过引入外键约束可以解决这个问题,此时这个外键称为 物理外键   --不推荐使用

物理外键:

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

 缺点:

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

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

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

逻辑外键:

 逻辑外键: 在业务层逻辑中,解决外键关联 -- 推荐

 多表设计:

 一对多:在多的一方添加外键,关联另外一方的主键

 一对一:任意一方,添加外键,关联另外一方的主键

 多对多:通过中间表来维护,中间表的两个外键,分别关联另外两张表的主键

多表查询:

select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;

-- 笛卡尔积  A集合与B集合的所有组合情况,总数量 = sum(A) * sum(B)

内连接:

-- A. 查询员工的姓名,及所属的部门名称(隐式内连接实现

-- select 字段列表 from 表1,表2 where 条件.....;

select tb_emp.name , tb_dept.name from tb_dept,tb_emp where tb_emp.dept_id = tb_dept.id;

-- 起别名

select e.name,d.name from tb_dept d,tb_emp e where e.dept_id=d.id;

   

-- B. 查询员工的姓名,及所属的部门名称(显示内连接实现

-- select 字段列表 from 表1 [inner] join 表2 on 连接条件.....;

select tb_emp.name,tb_dept.name from tb_emp inner  join tb_dept on  tb_emp.dept_id = tb_dept.id;

外连接:

-- 左外连接: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;

-- A. 查询员工表 所有 员工的姓名,和对应的部门名称(右外连接)

select e.name,d.name from tb_emp e right join tb_dept d on e.dept_id=d.id;

子查询:

-- 标量子查询

-- A. 查询 ”教研部“ 的所有员工信息

-- a. 查询 教研部 的部门id - tb_dept

select id from tb_dept where name='教研部';

-- b. 再查询该部门ID下的员工信息 - tb_emp

select * from tb_emp where dept_id = 2;

select * from tb_emp where dept_id = (select id from tb_dept where name='教研部');

-- B. 查询在 “方东白” 入职之后的员工信息

-- a. 查询方东白 的入职时间

select tb_emp.entrydate from tb_emp where username='fangdongbai';

-- b.再查询 方东白 之后入职的员工信息

select * from tb_emp where entrydate > (select tb_emp.entrydate from tb_emp where username='fangdongbai');

-- 列子查询 : 不做演示了 就是比标量子查询多几个条件,比如id不止一个

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

-- A.査询与"韦一笑”的入职日期 及 职位都相同的员工信息;

-- a.查询"韦一笑”的入职日期及职位

select entrydate,job from tb_emp where name='韦一笑';

-- b.查询与其入职日期 及 职位都相同的员工信息;

select *from tb_emp where entrydate ='2007-01-01'and job=2;

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

select *from tb_emp where entrydate = (select entrydate from tb_emp where name='韦一笑') and job=(select job from tb_emp where name='韦一笑');

事务:

格式:    

start transaction ;

-- 删除部门

delete from tb_dept where id=1;

-- 删除员工

delete from tb_emp where dept_id=1;

commit ;

rollback ;     -- 一旦出现异常可以通过rollback恢复回来。

/*

概念:

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

    要么同时成功,要么同时失败。 这样可以有效避免在逻辑外键中由于单个语句报错而导致数据不一致的情况。

阶段:

 开启事务:start transaction; / begin;

 提交事务:commit;

 回滚事务:rollback;

四大特性:(ACID)

重要:

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

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

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

 (比如在执行了start但不执行commit时,看到的表的数据没有变化,但是查询出来的表已经被操作过了),隔离性越高,事务越安全,效率越低。

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

 */

数据库优化:索引

创建索引:

-- create index idx_sku_sn on tb_sku(sn);  一次性创建索引

-- select * from tb_sku where sn = '1000000000354'; 不使用索引可能要十几秒  使用索引就几毫秒

索引概念:

索引是帮助数据库 高效获取数据 的 数据结构。

  没有索引时 查找数据就是 全表扫描

  有索引时,就是建立了一个搜索树 结点就是上面说的 sn,结点与数据相关联,可以直接拿结点取数据。

  优点:提高查询和数据排序效率

  缺点:占用内存,降低增、删、改的效率,因为当对数据进行增删改操作时,数据结构要进行一个维护操作(一般不用担心缺点)


 结构:

  MySQL数据库支持的索引结构有很多,Hash索引、B+Tree索引、Full-Text索引等。平常没有特别指明的话默认指B+树结构。

  二叉搜索树和红黑树在大数据量的情况下,层级深,检索速度慢,因为每个父亲节点只有2个子节点。

  B+Tree:

1.  一个节点可以有多个key值,每个key值都带有一个指针,指针指向下一个节点(磁盘块/页)

 2. 页是数据库进行磁盘管理的最小单位,一个页大小是16kb

 3. 非叶子节点:仅仅起到索引数据,查找数据的作用,并不管保存数据

 4.叶子节点:所有的数据都是在叶子节点保存的,所有的key都会出现在叶子节点。叶子结点会保持所有key的数据。

        叶子节点都是按照元素的key从小到大的顺序进行排序的,在叶子节点中间形成了一个双向链表(便于数据的排序及区间范围查询),可以通过上一个元素找到下一个元素,也可以通过下一个元素找到上一个元素。

  5.找到key为x的数据,会进入x>=n的那个指针,一直这样找下去。

语法:

  创建索引: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 from tb_emp;

注:

-- 一旦设定了某个字段的 唯一约束 ,就会自动生成一个 唯一索引

-- 一旦对某张表指定了主键,就会生成主键索引,主键索引是索引内性能最高的

-- 删除:删除tb_emp 表中name字段的索引

drop index idx_emp_name on tb_emp;

==========================结束============================

在Java中操作数据库,用的是MyBatis:一款优秀的 持久层 框架,用于简化JDBC的开发。


“明月清风晓星尘,凌霜傲雪宋子琛。”——《魔道祖师》

       

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

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

相关文章

为了加速上市,独角兽SHEIN的神秘创始人终于要露脸了?

神秘独角兽SHEIN在假期中迎来一个特殊新闻,《华尔街日报》、英国《金融时报》等媒体都报道称,SHEIN创始人许仰天最近先后前往美国和伦敦会见投资者,为其伦敦上市做准备。 (图源:英国《金融时报》官网) 这条…

使用fastjson解析json格式数据

在java里面无法直接解析JSON格式的字符串或文本&#xff0c;这时候我们就需要一个解析json格式的库&#xff0c;我们这里用fastjson,接下来的代码操作如下&#xff1a; 1、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson&…

【阿克曼odom里程计解算】:从下位机到上位机,从原理到代码实现

前言 本文将从阿克曼的里程计计算原理出发&#xff0c;讲解下位机STM32如何对电机编码器数据进行整合计算&#xff0c;再通过串口进行上下位机进行数据转发&#xff0c;最终在Linux板端对下位机发送来的数据进行积分计算并最终通过ROS的odometry数据进行全局广播。本文使用到的…

JavaScript 数组简单学习

目录 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例

自动化测试selenium篇(四)

1.定位一组元素 1.0 小问题 当运行测试代码程序需要跳转到页面&#xff0c;由于没有授权&#xff0c;导致页面不能成功跳转&#xff0c;且出现下面的情况&#xff1a; 步骤一&#xff1a;进入到idea&#xff0c;点击设置&#xff0c;如下所示&#xff1a; 进行上图操作之后&am…

图为大模型一体机的优秀落地案例:图为语伴

随着客户对即时、准确信息和解决方案的期望不断提升&#xff0c;企业面临着处理大量客户咨询、减少人力成本、提高服务效率等多重挑战。 而图为大模型一体机的诞生&#xff0c;就是为了应对传统的人工客服在处理客户咨询时&#xff0c;其产生的数据如聊天记录、通话记录等&…

中科院认可SCI期刊精选合集:5本国人友好刊,涵盖各领域!

本期&#xff0c;科检易学术将为大家精心推荐一系列既享有盛誉又相对容易发表的期刊。这些期刊不仅在各自的学术领域内具有较高的认可度和影响力&#xff0c;同时也以对国内研究者的友好态度而闻名。 无论是初出茅庐的研究新手还是经验丰富的学者&#xff0c;都能在这份涵盖多…

当今SNARKs全景

1. 引言 前序博客有&#xff1a; ZKP历史总览SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇Transparent 且 Post-quantum zkSNARKsSNARK DesignRollup项目的SNARK景观 SNARKs因&#xff1a; proof size证明时长验证时长密码学信任假设是否需要tr…

Chatgpt 原理解构

一、背景知识 1. 自然语言处理的发展历程 自然语言处理在不同时期呈现出不同的特点和发展态势。萌芽期&#xff0c;艾伦・图灵在 1936 年提出 “图灵机” 概念&#xff0c;为计算机诞生奠定基础&#xff0c;1950 年他提出著名的 “图灵测试”&#xff0c;预见了计算机处理自然…

linux 配置nfs

服务器端 sudo apt update sudo apt-get install nfs-kernel-server配置NFS服务器 mkdir /home/aa/workspace/nfsdir chmod 777 /home/aa/workspace/nfsdir sudo vim /etc/exports添加这个语句 /home/aa/workspace/nfsdir *(rw,sync,no_root_squash,insecure)sudo systemctl …

【音频生成】mac安装ffmpeg

前言 ffmpeg是一个开放源代码的自由软件&#xff0c;可以执行音频和视频多种格式的录影、转换、串流功能。算的上是进行音频处理的基本软件了&#xff0c;也是python包pydub的依赖。如果没有安装ffmpeg&#xff0c;就会报这个错。 FileNotFoundError: [Errno 2] No such file…

灯塔:JavaWeb笔记

什么是HTML、CSS? HTML (HypeText Markup Lanage):超文本标记语言。 超文本&#xff1a;超过了文本的限制&#xff0c;比普通的文本更强大。除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由表签构成的语言 HTML 标签都是提前预定义好的…

IT监控可视化:运维团队的智慧之眼

在当今这个数字化时代&#xff0c;IT系统已成为企业运营的核心支柱。随着业务的不断扩展和IT架构的日益复杂&#xff0c;运维团队面临着前所未有的挑战。如何高效、准确地监控和管理IT资源&#xff0c;确保系统的稳定性和可用性&#xff0c;成为了运维工作的重中之重。而IT监控…

利用可解释性技术增强制造质量预测模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2403.18731 本研究提出了一种利用可解释性技术提高机器学习&#xff08;ML&#xff09;模型性能的方法。该方法已用于铣削质量预测&#xff0c;这一过程首先训练 ML 模型&#xff0c;然后使用可解释性技术识别不需要的特征并去…

库函数相关(上一篇补充)

一、创建自己的头文件 在当前目录下创建一个my_head.h将这个文件移动到/usr/include目录 #ifndef __MY_HEAD_H__ #define __MY_HEAD_H__#include <stdio.h> #include <errno.h> #include <string.h>#define PRINT_ERR(s) do{\printf("%s %s %d\n&quo…

MongoDB初学者入门教学:与MySQL的对比理解

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &…

JavaEE: HTTPS的魅力与优势揭秘

文章目录 HTTPSHTTPS 是什么HTTPS 基本工作过程Fiddle 等抓包工具,为啥能解析 HTTPS 的数据? HTTPS HTTPS 是什么 HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层. 几个核心概念: 明文: 要传输的原始数据.密文: 把明文进行加密之后得到一个让别人不能理解…

【算法篇】三道题理解什么是递归,回溯和剪枝

递归&#xff0c;回溯&#xff0c;剪枝 想必大家再学习算法知识的路上经常听到回溯&#xff0c;剪枝类似的概念&#xff0c;对于初学者来说&#xff0c;很容易把他们理解成一种新的算法思想&#xff0c;其实回溯和剪枝只是在递归的基础上稍加修改&#xff0c;对于解决某些特定问…

k8s的pod的管理

常用的Pod基础命令 列出所有命名空间中的所有Pod kubectl get pods --all-namespaces 列出指定命名空间中的所有Pod kubectl get pods -n <namespace> 显示指定Pod的详细信息&#xff0c;包括状态、事件等 kubectl describe pod <pod-name> -n <namespace>…

机器学习入门(一)

一、机器学习概述 1、人工智能 像人一样智能的综合与分析&#xff0c;机器模拟人类。 是一个系统&#xff0c;像人那样思考&#xff0c;像人那样理性思考。 是一个系统&#xff0c;像人那样活动&#xff0c;像人那样合理的系统 2、机器学习 让机器自动学习&#xff0c;而不…