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日,国务院副总理刘鹤在北京调研集成电路企业发展,并主持召开座谈会。刘鹤指出,集成电路是现代化产业体系的核心枢纽,关系国家安全和中国式现代化进程。他表示,我国已形成较完整的集成电路产业链,也…...
2026论文写作工具红黑榜:AI论文平台怎么选?一篇看懂
2026年论文写作工具红黑榜出炉,红榜优先选千笔AI、ThouPen、豆包,适配国内学术规范,提升写作效率与合规性;黑榜需避开低质免费工具、无真实引用平台及过度依赖全文生成的工具。选择时建议按需求匹配度 - 数据可信度 - 成本承受力三…...
时光守护者:一键备份QQ空间历史说说的终极解决方案
时光守护者:一键备份QQ空间历史说说的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的记忆被分散在各个社交平台,QQ空…...
户用光伏爆火却被内耗拖垮?
当下户用光伏赛道卷疯了,订单接到手软,但不少光伏公司却陷入“越忙越乱”的内耗困境。从客户咨询、签单、设计安装,到并网运维,全流程环节繁杂、信息密集,亟需多部门高效协同,可很多企业还在靠人工记录、纸…...
如何使用Photon光影包提升Minecraft视觉体验:从安装到高级配置完全指南
如何使用Photon光影包提升Minecraft视觉体验:从安装到高级配置完全指南 【免费下载链接】photon A shader pack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/photon3/photon Photon光影包是一款为Minecraft: Java Edition设计的高…...
OpenClaw技能组合:GLM-4.7-Flash多技能协同工作的配置技巧
OpenClaw技能组合:GLM-4.7-Flash多技能协同工作的配置技巧 1. 为什么需要多技能协同? 去年冬天,我接手了一个内容运营的兼职项目。每天需要从十几个来源收集资料,整理成Markdown笔记,再根据主题生成不同风格的公众号…...
突破原厂限制:用开源相机工具解锁Sony相机7大隐藏功能
突破原厂限制:用开源相机工具解锁Sony相机7大隐藏功能 【免费下载链接】Sony-PMCA-RE Reverse Engineering Sony Digital Cameras 项目地址: https://gitcode.com/gh_mirrors/so/Sony-PMCA-RE 作为一名摄影爱好者,我一直梦想能充分掌控我的Sony相…...
Matrix Motor Extension:四通道嵌入式电机驱动模块详解
1. 项目概述Matrix Motor Extension 是一款面向嵌入式控制场景的四通道直流电机驱动扩展模块,专为需要多轴独立运动控制的智能硬件平台设计。其核心定位并非通用型电机驱动板,而是作为主控系统(如 STM32、ESP32、Raspberry Pi Pico 等&#x…...
Hearthstone-Script:3大核心功能带你轻松玩转炉石传说自动化![特殊字符]
Hearthstone-Script:3大核心功能带你轻松玩转炉石传说自动化!🔥 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitco…...
【问题】cursor无法识别python包
目录 问题描述解决方法 问题描述 pip install -e .安装的python可以正常导入,不报错,但cursor无法跳转,这应该怎么修复呢? 解决方法 在cursor的打开目录中新建pyrightconfig.json,填入extraPaths路径, …...
算力集群搭建:从单节点到多节点的部署教程
算力集群搭建:从单节点到多节点的部署教程📚 本章学习目标:深入理解从单节点到多节点的部署教程的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《云原生、云边端一体化与算力基建&#…...
