MySQL 多表查询与事务的操作

news2024/11/25 2:48:03

一,多表联查

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

# 创建部门表
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.coloradmin.cn/o/1531471.html

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

相关文章

MySQL 多表关系(介绍) 一对多/多对多

一对多 举例介绍 例子: 部门与员工 在常理上来说: 一个部门有多个员工,一个员工只对应一个部门实现方式: 在多的一方建立外键,指向一的一方的主键 多对多 举例介绍 例子: 学生与课程 在常理上来说: 一个学生可以有多个课程,一门课程可以有多个学生实…

热插拔技术(番外)

5、总线热插拔及系统解决方案 在实际运用中,总线上插入板卡时,由于新插入板卡电容的充电以及上电过程中一些低阻抗通道的存在,会产生极大的浪涌电流,拉低总线电平,对总线上其他设备产生干扰,影响总线上其他…

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

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

前端基础篇-深入了解 Ajax 、Axios

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。异步交互是指,可以在不…

高效编写产品规格书的秘诀与注意事项

高效编写产品规格书的秘诀:学会利用简单的工具,写出效果最佳的产品规格书。比如,你可以使用HelpLook、Markdown编辑器、LaTeX、notion等。 在快节奏的商业环境中,产品规格书是企业向市场展示产品特性和优势的重要工具。一份清晰、…

Linux——进程通信(三)命名管道

前言 我们在之前学习了匿名管道与匿名管道的应用——进程池,但是匿名管道的通信,需要有血缘关系的进程(通过fork创建的进程们),如果我想让两个毫不相干的进程进行通信,可以采样命名管道的方式(…

如何在Windows系统使用VS Code制作游戏网页并实现无公网IP远程访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…

提升Java编程安全性-代码加密混淆工具的重要性和应用

在Java编程领域中,保护代码安全性和知识产权至关重要。本文旨在探讨代码加密混淆工具在提升代码安全性和保护知识产权方面的重要性。我们将介绍几款流行的Java代码加密混淆工具,如ProGuard、DexGuard、Jscrambler、DashO和ipaguard,并分析它们…

【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

本文通过docker-compose构建一个单体的rabbtimq容器。 1,docker、docker-compose环境 首先需要有docker和docker-compose环境,docker安装[1],docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 [root192 ge…

单片机LED灯闪烁

延时函数计算&#xff08;相关代码生成&#xff09;&#xff1a; #include "reg52.h" #include <INTRINS.H> void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i 22;j 3;k 227;do{do{while (--k);} while (--j);} while (--i); }vo…

利用Xinstall,实现安装页面快速拉起App,推广效果倍增!

在移动互联网时代&#xff0c;App推广已成为广告主和开发者的重要任务。然而&#xff0c;面对激烈的市场竞争&#xff0c;如何提升推广效率、洞悉推广效果并衡量广告ROI&#xff0c;成为摆在他们面前的难题。今天&#xff0c;我们将聚焦一个关键环节——安装页面拉起App&#x…

Grid数据增强算法

算法原理 class Grid(object):def __init__(self, d1, d2, rotate1, ratio0.5, mode0, prob0.8):self.d1 d1self.d2 d2self.rotate rotateself.ratio ratioself.mode modeself.st_prob self.prob probdef set_prob(self, epoch, max_epoch):self.prob self.st_prob …

Debezium vs OGG vs Tapdata:如何实时同步 Oracle 数据到 Kafka 消息队列?

随着信息时代的蓬勃发展&#xff0c;企业对实时数据处理的需求逐渐成为推动业务创新和发展的重要驱动力。在这个快速变化的环境中&#xff0c;许多企业选择将 Oracle 数据库同步到 Kafka&#xff0c;以满足日益增长的实时数据处理需求。本文将深入探讨这一趋势的背后原因&#…

Java并发基石ReentrantLock:深入解读其原理与实现

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java的并发编程库中&#xff0c;ReentrantLock是一种非常重要的同步工具&#xff0c;它提供了一种比内置synchronized关键字更加…

基于ArcGIS等多技术融合提升环境、生态、水文、土地、农业、大气等领域科研技术应用

基于ArcGIS等多技术融合提升环境、生态、水文、土地、农业、大气等领域科研技术应用 原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247667012&idx5&snd2c5af65851b06ff7ee14a744c16009e&chksmfa771279cd009b6f8beff1c61c6b3b73087bf93e7d440…

顺序表的动态分配基本操作

#include <stdio.h> #include <stdlib.h>// 顺序表存储空间动态分配 #define InitSize 10 // 顺序表初始长度 typedef int ElemType; // int类型重命名为ElemType&#xff0c;方便后续调整typedef struct { // 定义结构体ElemType *data; // 用静…

“垃圾不落地,捡跑来助力”学雷锋志愿服务暨党支部党日活动

指导思想 紧紧围绕建设和谐社会主题&#xff0c;以创建文明为契机&#xff0c;学习雷锋精神&#xff0c;为人民服务为宗旨&#xff0c;大力开展志愿捡跑活动&#xff0c;激发大家积极参与志愿活动的热情&#xff0c;大力弘扬奉献、友爱、互助、进步的志愿服务精神。 活动启动 …

维度建模理论之事实表

事实表概述 事实表作为数据仓库维度建模的核心&#xff0c;紧紧围绕着业务过程来设计。其包含与该业务过程有关的维度引用&#xff08;维度表外键&#xff09;以及该业务过程的度量&#xff08;通常是可累加的数字类型字段&#xff09;。 事实表特点 事实表通常比较“细长”…

N 皇后00

题目链接 N 皇后 题目描述 注意点 1 < n < 9 解答思路 首先想到的是使用深度优先遍历回溯找到所有的情况&#xff0c;基本思路是&#xff1a;逐行确定Q在该行的位置&#xff0c;且每一行Q都是从第0列到第n - 1列全部考虑&#xff0c;在确定Q在任意一行的某一列时&am…

Java集合Collection之LinkedList

LinkeList LinkedList&#xff08;双向链表&#xff09;是一种常见的线性数据结构&#xff0c;但是并不会按线性的顺序存储数据。它由一系列节点组成&#xff0c;每个节点包含数据部分和一个指向下一个节点的引用。相比于数组&#xff0c;链表具有动态大小、插入和删除效率高的…