MySQL基础篇3
第一章 多表关系实战
1.1 实战1:省和市
方案1:多张表,一对多
方案2:一张表,自关联一对多
id=1
name=‘北京’
p_id = null;
id=2
name=‘昌平’
p_id=1
id=3
name=‘大兴’
p_id=1
id=3
name=‘上海’
p_id=null
id=4
name=‘浦东’
p_id=3
1.2 实战2:用户和角色
多对多关系
第二章 多表查询之子查询
提供表结构如下:
-- 部门表
create table department (id int primary key auto_increment,name varchar(50)
);
-- 员工表
create table worker (id int primary key auto_increment,name varchar(50), -- 名字sex char(2), -- 性别money double, -- 工资inWork_date date, -- 入职时间depart_id int, -- 部门foreign key(depart_id) references department(id)
);
2.1 初始化数据
-- 插入部门数据
insert into department(name)
values('技术研发'), ('市场营销'), ('行政财务');
-- 插入员工数据
insert into worker(name, sex, money, inWork_date,depart_id)
values('cuihua', '女', 10000, '2019-5-5', 1);
insert into worker(name, sex, money, inWork_date,depart_id)
values('guoqing', '男', 20000, '2018-5-5', 2);
insert into worker(name, sex, money, inWork_date,depart_id)
values('qiangge', '男', 30000, '2018-7-5', 3);
insert into worker(name, sex, money, inWork_date,depart_id)
values('huahua', '女', 10000, '2019-5-5', 1);
2.2 什么是子查询?
一个查询的结果作为另一个查询的条件。
有查询的嵌套,内部的查询就是子查询。
子查询,需要使用小括号包含起来。
-- 查询技术研发部门有哪些员工
-- 1. 先查询所有的员工
select * from worker where depart_id = 1;
-- 2. 查询部门
select id from department where name = '技术研发';
-- 使用子查询的方式,来统一查询对应的数据
select * from worker where depart_id = (select id from department where name
= '技术研发');
2.3 常见三种做法
1)单行单列
也就是结果只有一个
select 指定的字段 from 表 where 字段 = (子查询)
-- 谁的工资最高?
-- 1. 先把最高工资找出来
select MAX(money) from worker;
-- 2. 再去员工表中,把对应的员工信息查出来
select * from worker where money = (select MAX(money) from worker);
-- 谁的工资少于平均工资?
-- 1. 先把平均工资算出来
select AVG(money) from worker;
-- 2. 再去员工表中,把对应的员工信息查出来
select * from worker where money < (select AVG(money) from worker);
2)多行单列
当我们在处理多行单列的时候,有可能会出现多个值,这时候可以类似数组或集合一样处理,在 SQL中,使用 in 关键字即可。
-- 查询那些工资大于 12000 的人都来自哪些部门
-- 1. 先查大于 5000 的员工对应的部门 id
select depart_id from worker where money > 12000;
-- 2. 根据部门的编号,再找出部门的名字
-- 你查找到的记录,多于 1 行了 Subquery returns more than 1 row
-- select name from department where id = (select depart_id from worker where money > 12000);
select name from department where id in (select depart_id from worker where money > 12000);
-- 查询行政财务和技术研发中的所有员工的信息
-- 1. 先根据名字来查找 id
select id from department where name in ('行政财务', '技术研发');
-- 2. 再去查询相关的员工
select * from worker where depart_id in (select id from department where name in ('行政财务', '技术研发'));
3)多行多列
当你的子查询只要是多列,那么它肯定在 from 后面是以一张表存在的。
select 字段 from (子查询) 表别名 where 条件;
子查询在这里要作为表,然后还要给一个别名,如果不这样处理的话,就没办法访问到表中的字段。
-- 从 2019 年后入职的员工和相关部门信息
-- 1. 2019-1-1 后的时间
select * from worker where inWork_date >= '2019-01-01';
-- 2. 当我们从上面查找到对应的员工,则可以通过员工的 depart_id 找到对应的部门信息
select * from department d, (select * from worker where inWork_date >=
'2019-01-01') w
where d.id = w.depart_id;
-- 将上面的例子,换成内连接实现
select * from worker inner join department on worker.depart_id = department.id where inWork_date >= '2019-01-01';
第三章 事务
3.1 事务原理
事务:要么成功,要么不成功。
转账,A - 500,B + 500。转账的过程中,有可能会有一些突发的情况,导致转账操作会出现一些意料不到的问题。所以,在这里,我们需要建立一个通道,在通道中完成的操作,要么成功,要么不成功的时候及时回滚数据,避免造成大面积的业务混乱。
-- 账户表
create table bankCount(id int primary key auto_increment,name varchar(50),money double
);
-- 添加数据
insert into bankCount(name, money)
values ('cuihua', 1000), ('banban', 2000);
-- 翠花给班班转钱 500
update bankCount set money = money - 500 where name = 'cuihua';
update bankCount set money = money + 500 where name = 'banban';
-- 提供一个事务通道,让转账的操作稳妥一些,如果中途出现问题,及时回滚数据,不要造成数据丢失
事务的原理:
当我们在 MySQL 中,如果开启了事务,那么你所有的操作都会临时被保存在事务日志中,只有遇上commit(提交)命令的时候,才会同步到数据表中。如果遇上 rollback 和 断开连接,那么它都会去清空你的事务日志。
3.2 手动提交
1)核心 SQL 语句
开启事务:start transaction
提交事务:commit
回滚事务:rollback
2)实现过程
第一步:开启事务
第二步:执行你的 SQL 语句
第三步:提交事务
第四步:如果出现问题的话,则回滚事务(数据)
3)事务提交
第一步:开启事务
start transaction;
第二步:执行你的 SQL 语句
update bankCount set money = money - 500 where name = 'cuihua';
update bankCount set money = money + 500 where name = 'banban';
第三步:如果出现问题的话,则回滚事务(数据)
commit;
4)事务回滚
第一步:开启事务
start transaction;
第二步:执行你的 SQL 语句
update bankCount set money = money - 500 where name = 'cuihua';
update bankCount set money = money + 500 where name = 'banban';
第三步:提交事务
rollback;
3.3 自动提交
MySQL 默认情况下,每一条 DML 语句都是一个单独的事务,都会对应的开启一个事务,当你执行的时候,同时自动默认提交事务。
1)自动提交事务
-- 随便一个 DML 语句都是会自动提交事务的
update bankCount set money = money + 500 where name = 'banban';
2)取消自动提交
@@autocommit 原来是 1 的,如果你要取消的话,则设置为 0 即可(但不建议)
set @@autocommit = 0;
3.4 事务
1)事务的特性 ACID
a. 原子性:Atomicity 在每一个事务中,都可以看成是一个整体,不能将其再度分解,所有的操作,要么一起成功,要么一起失败。
b. 一致性:Consistency 在事务执行前数据的所有状态跟执行后的数据状态应该是一样的。比如,转账前两个账户的金额总和应该跟转账后两个账户的总金额都是一样的。
c. 隔离性:Isolation 多个事务之间不能相互影响,必须保证其操作的单独性,否则会出现一些串改的情况,执行的时候应该保持隔离的状态。
d. 持久性:Durability 如果我们的事务执行成功之后,它将把数据永久性存储到数据库中,哪怕设备关机之后,也是能够保存下来的。
2)隔离级别可能会出现的问题
a. 脏读:其中一个事务读取到了另外一个事务中的数据(尚未提交的数据)。
b. 不可重复读:一个事务中两次读取数据的时候,发现数据的内容不一样。要求,多次读取数据的时候,在一个事务中读出的都应该是一样的。一般是由于 update 操作引发,所以将来执行的时候要特别注意。
c. 幻读:一般都是 insert 或者 delete 操作的时候会出现这个问题。一个事务中,两次读取数据的时候,发现数据的数量不一样。要求,在一个事务中多次去读取数据的时候都应该是一样的。
3)MySQL 的四种隔离级别
如果你将来使用 命令行 来设置隔离级别的时候,只有在当次会话中是有效的。只要你关掉了窗口,隔离级别会即时恢复到默认状况 — RR。
read uncommitted 读未提交
read committed 读已提交
repeatable read 可重复读(默认)
serializable 串行化
3.5 案例演示(了解)
1)脏读
先打开窗口,设置隔离级别:
set global transaction isolation level read uncommitted;
如果设置的级别是“读未提交”,其实会造成一个脏读的问题。脏读,会导致一个事务读取到了另外一个事务中的数据,其实非常危险。
解决方案:提升你的隔离级别。
set global transaction isolation level read committed;
当你设置成 read commintted 就不能读取到另外一个事务中的数据了。
只有当第一个事务提交了数据之后,第二个事务才能够去读取到数据。
read committed 可以避免数据的脏读。
2)不可重复读
如果将来,你写的 SQL 语句,发现第一次查询的时候,是一个结果,第二次查询的时候又是另外一个结果。一般都是最后一次查询的才是正确的,有时候第一次不正确的结果会被误用,就会给用户不好的体验。
订票:PC 端 — App 端 — 短信 如果说每次查询的结果不一样的话,则会导致推送用户信息的时候,呈现的数据不同步。
解决方案:将你的级别设置为 repeatable read 可重复读,也就是 mysql 默认的级别(不建议修改)。
3)幻读(课后自己演示)
set global transaction isolation level serializable ;
第四章 DCL
DDL create、alter、drop
DML insert、update、delete
DQL select、show
DCL grant、revoke
4.1 创建用户
如果将来创建一个新的用户,它并不会拥有与 root 用户一样的权限,root 是超级管理员,所有的权限它都有。
create user '用户名'@'主机名' identified by '密码';
CREATE USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '密码';
create user 'cuihua'@'localhost' identified by '1234';
create user 'huahua'@'localhost' identified by '1234';
4.2 授权
如果想要使用这些新增的用户,则需要授予一定的权限。
grant 权限1, 权限2,..., 权限N on 数据库名.表名 to '用户'@'主机名'
-- cuihua 的权限
-- 如果希望在某个数据库下所有的表都能用的话,则建议写成 数据库名.*
grant create, alter, insert, update, select on hello.* to
'cuihua'@'localhost';
-- 简单的赋权限方法
grant all on *.* to 'huahua'@'localhost';
4.3 撤销授权
revoke all on hello.* from 'cuihua'@'localhost';
4.4 查看权限
-- 查看权限
show grants for '用户名'@'主机名';
4.5 删除用户
drop user '用户名'@'主机名';
4.6 修改用户的密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
相关文章:

MySQL基础篇3
第一章 多表关系实战 1.1 实战1:省和市 方案1:多张表,一对多 方案2:一张表,自关联一对多 id1 name‘北京’ p_id null; id2 name‘昌平’ p_id1 id3 name‘大兴’ p_id1 id3 name‘上海’ p_idnull id4 name‘浦东’…...

携程 x TiDB丨应对全球业务海量数据增长,一栈式 HTAP 实现架构革新
随着新冠病毒疫情的缓解和控制,全球旅游业逐渐开始重新复苏。尤其在一些度假胜地,游客数量已经恢复到疫情前的水平。 携程作为全球领先的一站式旅行平台,旗下拥有携程旅行网、去哪儿网、Skyscanner 等品牌。携程旅行网向超过 9000 万会员提供…...
记一次Kafka warning排查过程
1、前因 在配合测试某个需求的时候,正好看到控制台打印了个报错,如下: 2023-03-06 17:05:58,565[325651ms][pool-28-thread-1][org.apache.kafka.common.utils.AppInfoParser][WARN] - Error registering AppInfo mbean javax.management.I…...
MySQL学习笔记(6.视图)
1. 视图作用 (1). 简化业务,将多个复杂条件,改为视图 (2). mysql对用户授权,只能控制表权限,通过视图可以控制用户字段权限。 (3). 可以避免基本表变更,影响业务。只需更改视图即可。 2. 视图(创建&…...
java多线程与线程池-01多线程知识复习
多线程知识复习 文章目录 多线程知识复习第1章 多线程基础1.1.2 线程与进程的关系1.2 多线程启动1.2.1 线程标识1.2.2 Thread与Runnable1.2.3 run()与start()1.2.4 Thread源码分析1.3 线程状态1.3.1 NEW状态1.3.2 RUNNABLE状态1.3.3 BLOCKED状态1.3.4 WAITING状态1…...
Typescript - 将命名空间A导入另一个命名空间B作为B的子命名空间,并全局暴露命名空间B
前言 最近相统一管理 ts 中的类型声明,这就需要将各模块下的命名空间整合到全局的命名空间下,牵涉到从别的文件中引入命名空间并作为子命名空间在全局命名空间中统一暴露。 将命名空间A导入另一个命名空间B作为B的子命名空间 文件说明 assets.ts 文件中…...

Windows下实现Linux内核的Python开发(WSL2+Conda+Pycharm)
许多软件可以通过Python交互,但没有开发Windows版本,这个时候装双系统或虚拟机都很不方便,可以采取WSL2CondaPycharm的策略来进行基于Linux内核的Python开发。启动WSL2,安装Linux内核教程:旧版 WSL 的手动安装步骤 | M…...

新闻发布网站分析及适用场景
在当今数字时代,发布新闻的渠道已经不再局限于传统媒体,越来越多的企业、组织和个人开始使用互联网平台发布新闻稿,以提升品牌知名度和影响力。本文将介绍一些可以发布新闻的网站,并分析其特点和适用场景。一、新闻稿发布平台1.新…...

云原生时代顶流消息中间件Apache Pulsar部署实操之Pulsar IO与Pulsar SQL
文章目录Pulsar IO (Connector连接器)基础定义安装Pulsar和内置连接器连接Pulsar到Cassandra安装cassandra集群配置Cassandra接收器创建Cassandra Sink验证Cassandra Sink结果删除Cassandra Sink连接Pulsar到PostgreSQL安装PostgreSQL集群配置JDBC接收器创建JDBC Sink验证JDBC …...

Input子系统(一)启动篇
代码路径 基于AndroidS(12.0)代码 system/core/libutils/Threads.cppframeworks/base/services- java/com/android/server/SystemServer.java- core- java/com/android/server/input/InputManagerService.java- jni/com_android_server_input_InputMan…...
WuThreat身份安全云-TVD每日漏洞情报-2023-03-08
漏洞名称:Agilebio Lab Collector 远程命令执行 漏洞级别:高危 漏洞编号:CVE-2023-24217,CNNVD-202303-375 相关涉及:Agilebio Lab Collector 4.234 漏洞状态:EXP 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-05536 漏洞名称:PrestaShop “Xen Forum”模…...
ABP IStringLocalizer部分场景不生效的问题
问题描述: 本地项目依赖注入本地化服务时候生效,第三方项目调用本地接口时候出现本地化失效的问题。 解决方案: 第三方服务封装的 GetHttp 请求的请求头中添加 语言相关信息 request.Headers.Add("accept-language", "zh-C…...

数组(四)-- LC[167] 两数之和-有序数组
1 两数之和 1.1 题目描述 题目链接:https://leetcode.cn/problems/two-sum/description/ 1.2 求解思路 1. 暴力枚举 最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x 参考代码 class Solution(object):def twoSum(self, n…...

Mac电脑,python+appium+安卓模拟器使用步骤
1、第一步,环境搭建,参考这位博主的文章,很齐全 https://blog.csdn.net/qq_44757414/article/details/128142859 我在最后一步安装appium-doctor的时候,提示权限不足,换成sudo appium-doctor即可 2、第二步࿰…...
Linux命令·find进阶
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。 exec解释:-exec 参数后面跟的是command命令,它的终止是以;为结束标志的࿰…...

R语言ggplot2 | 用百分比格式表示数值
📋文章目录Percent() 函数介绍例子1,在向量中格式化百分比:例子2,格式化数据框列中的百分比:例子3,格式化多个数据框列中的百分比:如何使用percent()函数在绘图过程展示通常在绘图时,…...
【代码训练营】day53 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和
所用代码 java 最长公告子序列 LeetCode 1143 题目链接:最长公告子序列 LeetCode 1143 - 中等 思路 这个相等于上一题的不连续状态 dp[i] [j]:以[0, i-1]text1和以[0, j-1]text2 的最长公共子序列的长度为dp[i] [j]递推公式: 相同&#x…...

消息队列理解
为什么使用消息队列 使⽤消息队列主要是为了: 减少响应所需时间和削峰。降低系统耦合性(解耦/提升系统可扩展性)。 当我们不使⽤消息队列的时候,所有的⽤户的请求会直接落到服务器,然后通过数据库或者 缓存响应。假…...

【Linux内核一】在Linux系统下网口数据收发包的具体流向是什么?
在TCP/IP网络分层模型里,整个协议栈被分成了物理层、链路层、网络层,传输层和应用层。物理层对应的是网卡和网线,应用层对应的是我们常见的Nginx,FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中…...

南京、西安集成电路企业和高校分布一览(附产业链主要厂商及高校名录)
前言 3月2日,国务院副总理刘鹤在北京调研集成电路企业发展,并主持召开座谈会。刘鹤指出,集成电路是现代化产业体系的核心枢纽,关系国家安全和中国式现代化进程。他表示,我国已形成较完整的集成电路产业链,也…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...