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

  • 博客主页:誓则盟约
  • 系列专栏: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.rhkb.cn/news/443616.html

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

相关文章

Python对PDF文件的合并操作

在处理 PDF 文件时,合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能,其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口,包括 merge() 方法,可…

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密,只需把公钥发送到server就可,会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…

全闪 SDS 一体机提供 FC 能力承载医院核心业务

邹平市人民医院使用 X3000 SDS 一体机组建分布式存储集群,通过 FC 接口 与 VMware 集群连接,以全闪池承载核心业务,对象存储承载 PACS 数据,实现存储架构的升级改造。 “新医改”的不断推进,对医院的运营管理、服务质…

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面:https://illusionno.github.io/ 源码也在这里:https://github.com/illusionno/my-blog (如果觉得有帮助,可以点颗star✨) 使用的主题是vuepress-theme-reco2.x,并在上面进行了一些调…

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集,标注为json格式,总共有5类 避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张)&#xff0…

【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)

前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

设备多久(60/50/40min)未上报,类似场景发送通知实现方案

场景描述 设备比较多,几十万甚至上百万,设备在时不时会上报消息。 用户可以设置设备60分钟、50分钟、40分钟、30分钟未上报数据,发送通知给用户,消息要及时可靠。 基本思路 思路: 由于设备在一直上报,如果…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里,编写高效且易于维护的测试脚本是一项挑战,尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具,它提供了丰富的API和灵活的脚本编写方式,帮助测试人员高效地开展UI自动化测试。然而&#xf…

Linux的环境与历史

目录 引言 1. Linux 背景介绍 2. 开源 3. 官网 4. 企业应用现状 5. 发行版本 6.见见猪跑 引言 在这个信息化时代,掌握一门操作系统技能显得尤为重要。Linux作为一款开源、稳定且功能强大的操作系统,不仅在服务器领域占据主导地位,也逐渐…

哈希表结构

哈希表结构:数组链表 案例一:HashSet集合的常见使用方法 package com.collection;import java.util.HashSet; import java.util.Iterator;/*** HashSet集合的使用* 存储结构:哈希表(数组链表红黑树)*/ public class Demo07 {public static v…

性能测试学习6:jmeter安装与基本配置/元件/线程组介绍

一.JDK安装 官网:https://www.oracle.com/ 二.Jmeter安装 官网:http://jmeter.apache.org/download_jmeter.cgi 下载zip包,zip后缀那个才是Windows系统的jmeter 三.Jmeter工作目录介绍 四.Jmeter功能 1)修改默认配置-汉化 2&am…

SapGUI For Windows捕获技术

一、SapGUI For Windows捕获技术 文章目录 一、SapGUI For Windows捕获技术SAP GUI:SAP NetWeaver Business Client:SAP Fiori:二.Sap的自动化配置SAP客户端配置三.Sap GUI自动化脚本四.Sap GUI自动化开发SAP GUI: SAP图形用户界面,是最常用的SAP前端界面。它是一个桌面应…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

leetcode58:最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1: 输入:s "Hello World" 输出&#xff…

Linux SSH服务

Linux SSH(Secure Shell)服务是一种安全的远程登录协议,用于在Linux操作系统上远程登录和执行命令。它提供了加密的通信通道,可以在不安全的网络环境中安全地进行远程访问。 SSH服务在Linux系统中通常使用OpenSSH软件包来实现。它…

【Java SE 题库】输出一个数的二进制的奇数位和偶数位

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 分析 3. 代码实现 3.1 运行结果 4. 小结 1. 题目 输入一个数,请分别打印这个数二进制的奇数位和偶数位 例:15 …

Element-快速入门

什么是 Element 在现代前端开发中,组件化的思想日益盛行,Element组件库作为一款流行的UI组件库,特别适用于基于Vue.js的项目,它为开发者提供了丰富的组件和良好的开发体验。 想要使用Element的组件库,我们需要完成下面…

yolov8-pose的TensorRT动态库部署(C++)

文章目录 参考代码概要硬件动态库代码文件结构头文件yolov8-pose.hyolov8-pose.cppCMakeLists.txt调用例子main.cppCMakeLists.txt获取engine模型测试结果参考代码 https://github.com/triple-Mu/YOLOv8-TensorRT 概要 为了方便使用,基于上述开源代码,将其封装成动态库,方…

GAMES104:16 游戏引擎的玩法系统:基础AI-学习笔记

文章目录 一,寻路/导航系统Navigation1.1 Walkable Area1.1.1 Waypoint Network1.1.2 Grid1.1.3 Navigation Mesh1.1.4 Sparse Voxel Octree 1.2 Path Finding1.2.1 Dijkstra Algorithm迪杰斯特拉算法1.2.2 A Star(A*算法) 1.3 Path Smoothin…

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法

如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。(注意&#x…