MySQL 多表查询与事务的操作

一,多表联查

有些数据我们已经拆分成多个表,他们之间通过外键进行连接.当我们要查询两个表的数据,各取其中的一列或者多列.
这时候就需要使用多表联查.
数据准备:

# 创建部门表
create table dept(id int primary key auto_increment,name varchar(20)
)
insert into dept (name) values ('开发部'),('市场部'),('财务部'); 
# 创建员工表
create table emp (id int primary key auto_increment,name varchar(10),gender char(1), -- 性别salary double, -- 工资join_date date, -- 入职日期dept_id int,foreign key (dept_id) references dept(id) -- 外键,关联部门表(部门表的主键)
) 
insert into emp(name,gender,salary,join_date,dept_id) values('孙悟空','男
',7200,'2013-02-24',1);
insert into emp(name,gender,salary,join_date,dept_id) values('猪八戒','男
',3600,'2010-12-02',2);
insert into emp(name,gender,salary,join_date,dept_id) values('唐僧','男',9000,'2008-
08-08',2);
insert into emp(name,gender,salary,join_date,dept_id) values('白骨精','女
',5000,'2015-10-07',3);
insert into emp(name,gender,salary,join_date,dept_id) values('蜘蛛精','女
',4500,'2011-03-14',1);

如果现在我们想知道对应员工所在的部门,就需要联查,但是如果仅仅select * from emp,dept;则会把所有的情况罗列出来,但是有效的数据,其实仅仅是emp.dept_id= dept.id,也就是外键等于主键的情况.

--所有的情况罗列出来,员工表4*部门表3=12列
select * from emp,dept;
--满足条件的情况,只有四条
select * from emp,dept where emp.`dept_id` = dept.`id`;
--只展示员工名字和部门名
select emp.`name`, dept.`name` from emp,dept where emp.`dept_id` = dept.`id`;

二,子查询

有的时候,我们需要先查一个表,得到结果后才能查询另一个表.比如说,我们现在要查询:开发部中有哪些员工.
如果我们一步步来,就需要走两步:

select id from dept where name='开发部' ;
select * from emp where dept_id = 1;

如果采用子查询,就是把查询的结果再次作为查询的条件进行查询:

1) 一个查询的结果做为另一个查询的条件
2) 有查询的嵌套,内部的查询称为子查询
3) 子查询要使用括号

当第一次查询的结果是多行一列时,还可以用in关键字,以下两种写法是等价的:

select name from dept where id =(select dept_id from emp where salary > 5000);
select name from dept where id in (select dept_id from emp where salary > 5000);

当第一次查询是多行多列时,则需要将第一次的查询结果起个别名,例如:查询出 2011 年以后入职的员工信息,包括部门名称.

select * from dept d, (select * from emp where join_date >='2011-1-1') e where
d.`id`= e.dept_id ;
--d是dept表的别名
--e是select * from emp where join_date >='2011-1-1'的结果表别名

三,事务

事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的
SQL 语句都要回滚,整个业务执行失败。
现在我们模拟张三转给李四500块钱,就需要张三减少500,李四增加500来

-- 创建数据表
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000);
-- 张三账号-500
update account set balance = balance - 500 where name='张三';
-- 李四账号+500
update account set balance = balance + 500 where name='李四';

但是如果在执行到张三账户-500的时候,服务出问题了,李四的账号并没有+500 元,数据就出现问题了。我们需要保证其中
一条 SQL 语句出现问题,整个转账就算失败。只有两条 SQL 都成功了转账才算成功。这个时候就需要用到事务。
对于事物,分为手动提交事务和自动提交事务.

3.1,手动提交事务

主要的流程如下:

1,start transaction;开启事务
2,若全部sql语句执行正常,则提交事务:commit;
3,如有sql语句执行出问题,则回滚所有事务中的sql语句:rollback;

例如:

--开启事务
start transaction;
-- 张三账号-500
update account set balance = balance - 500 where name='张三';
-- 李四账号+500
update account set balance = balance + 500 where name='李四';
rollback;

就会发现这两条修改账户余额的sql都回滚了.

3.2,自动提交事务

MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕
自动提交事务,MySQL 默认开始自动提交事务

--查看mysql是否开启自动提交事务,1:开启,0:未开启
select @@autocommit;
--设置为不自动提交事务
set @@autocommit=1

这样之后,每次写的sql语句不会更新,而是需要执行commit后才会更新.

3.3,回滚点

每次回滚总不能都全部回滚,前面操作都已经成功,可以在当前成功的位置设置一个回滚点。可以供后续失败操作返回到该位置,而不是返回所有操作,这个点称之为回滚点。

--开启事务
start transaction;
savepoint 回滚点名字a;
savepoint 回滚点名字b;
rollback to 回滚点名字a;

3.4,事务的隔离级别

事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题:
请添加图片描述
MySQL 数据库有四种隔离级别:
请添加图片描述
需要注意的事情:

--查看隔离级别
select @@tx_isolation;
--设置隔离级别
set global transaction isolation level 级别字符串;
--示例设置隔离级别为read committed
set global transaction isolation level read committed;
隔离级别越高,性能越差,安全性越高。

四,mysql用户角色的创建

我们现在默认使用的都是 root 用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。

4.1,创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

请添加图片描述
示例,创建用户1,让他能在任何电脑登录,密码为123:

create user 'user1'@'%' identified by '123';

4.2,给用户授权

新创建的用户是没有权限的,需要另外给他授权.

--权限有: CREATE、ALTER、SELECT、INSERT、UPDATE 等。如果要授予所有的权限则使用 ALL
GRANT 权限 1, 权限 2... ON 数据库名.表名 TO '用户名'@'主机名';
--数据库名.表名:该用户可以操作哪个数据库的哪些表。如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*
--示例:
grant CREATE,ALTER,SELECT,INSERT,UPDATE on db2.account to 'user1'@'%';
--查看用户权限
SHOW GRANTS FOR '用户名'@'主机名';
--撤销用户授权
revoke all on 数据库名.表名 from '用户名'@'主机名';
--删除用户
DROP USER '用户名'@'主机名';
--修改管理员登录密码(未登录情况)
mysqladmin -uroot -p password 新密码
--修改普通用户密码
set password for '用户名'@'主机名' = password('新密码');

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

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

相关文章

DevEco Studio 项目创建

安装DevEco Studio后开始使用,双击桌面DevEco Studio 快捷方式弹出界面: 选择Application —> Empty Ability,点击Next 项目配置 Project name:工程的名称,可以自定义,由大小写字母、数字和下划线组成。…

vscode搜索总是搜到修改记录文件如何处理

如图每次搜索出来的结果总是有好多编辑记录中的文件,给自己找文件及提交代码时带来很大困扰,每次都得删特别麻烦。 解决办法: 如上图在插件里找到 local history 点击 ”禁用“ 即可。以后再编辑代码就不会产生修改记录文件了。 如果直接搜索…

深入浅出前端本地储存

引言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案: CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

前端Prettier 插件的使用配置(详细)

各个参数代表的意思:printWidth:每行代码的最大长度限制。 tabWidth:选项用于控制制表符的宽度。 useTabs:指定是否使用制表符代替空格。 semi:指定是否在语句的末尾添加分号。 singleQuote:指定是否使用单引号或双引号…

【Java程序员福音】每个 Java 开发人员都应该知道的 10 个基本工具

我试图在代码库,项目规划,构建和部署,测试自动化和基础设施自动化中包含工具。作为负责端到端管理项目的高级 Java 开发人员,这些工具将帮助您更有效地完成工作。 让我们看到 Java 程序员的一些基本工具 1、Git 我认为 Git 和 Github 应该是所有 Java 程序员应该学习和掌…

②免费AI软件开发工具测评:通义灵码 VS 码上飞

前言 我又双叒叕来测评了!上次给大家带来的是iFlyCode和CodeFlying两款产品的测评,受到了大家的一致好评~ 今天咱就继续来聊聊,这次我们选的的对象是通义灵码和码上飞,从名字上也能看到出来这两款产品一定是跟软件开发有关系的&…

Zerotier 异地组网方案初探

前言 我之前想要异地组网的话,一般都采用内网穿透的方法,但是这个内网穿透有弊端就是都是要通过公网服务器转发流量,对于大流量的传输就比较不方便,我发现了Zerotier 这个工具非常的好用,是基于p2p的 这是一个类似于…

驶向高效巅峰:Nginx高并发性能优化实战指南与场景案例拆解

身处瞬息万变的互联网世界,高并发场景下服务器的性能优化尤为重要,而Nginx正是这一领域的超级舵手。本文将深入浅出地揭示Nginx在高并发环境下的性能优化之道,并通过具体场景配置案例,助你掌握这一关键技术,提升服务器…

静态网络配置

一、查看网络命令 1.命令行查看网络配置 1、查看ip\硬件设备-网卡 ifconfig -a ifconfig ens160 网卡名称 ip addr show ip addr show ens160 nmcli device show ens160 nmcli con up ens160 2、主机名称 hostname hostname hfj.huaxia.com 3、查看路由和网关 rou…

慎投!共10本「On Hold」期刊被剔除,2本中科院TOP仍在调查中!

2024年3月18日,科睿唯安本年度第三次更新了Web of Science核心期刊目录。 此次SCIE/SSCI期刊目录共8本期刊发生变动,情况如下: 经小编查询,此次更新后,共有7本“On Hold”期刊被数据库剔除,其中还包括2024年…

手撕算法-最长公共子序列(二)

最长公共子序列(二) 分析:典型的动态规划,直接看代码了。 代码: import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** longest common sub…

VS+QT Debug正常但Release无法识别头文件

!!!,这个问题一般是在第一次编译的时候遇见的,包括之前使用debug也是 在Qt Installation一定要修改成自己版本的编译器,修改一次以后基本是不用再修改的

【机器学习】TinyML的介绍以及在运动健康领域的应用

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

全球盲盒火热下,海外盲盒APP助力我国盲盒出海

盲盒具有不确定性,与各类热门影视动漫合作推出的专属盲盒商品,吸引了无数年轻人,成为了年轻人的娱乐消费首选方式。 在互联网电商的推动下,盲盒在全球内的市场规模迅速扩大。受到市场增长的影响,各类资本公司也纷纷进…

深入浅出前端本地储存(1)

引言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案: CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

基于python的4s店客户管理系统

技术:pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

pyvista可视化代码优化

同时显示多组点云 import os import glob import randomimport pyvista as pvdef display_multi_mesh(meshes: list, titlesNone, point_size3, opacity0.9):num len(meshes)pl pv.Plotter(shape(1, num))pl.set_background([0.9, 0.9, 0.9])for i in range(num):pl.subplo…

jmeter打开文件报异常无法打开

1、问题现象: 报错部分内容: java.desktop does not export sun.awt.shell to unnamed module 0x78047b92 [in thread "AWT-EventQueue-0"] 报错部分内容: kg.apc.jmeter.reporters.LoadosophiaUploaderGui java.lang.reflect.Invo…

docker小白第十四天之Portainer与CIG

Portainer简介 Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 Portainer命令安装 # 一个容器可以同时起多个-p端口,restartalways表示随时在线,重启机器后也…

5 Redis主从集群

文章目录 Redis主从集群1.1主从集群搭建1.1.1 伪集群搭建与配置1.1.2 分级管理1.1.3 容灾冷处理 1.2主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程 2.1 哨兵机制实现2.1.1 简介2.2.2 Redis 高可用集群搭建2.2.3 Redis 高可用集群的启动2.2.4 Sentinel 优化配置 3.1 哨…