MySQL中的多表查询与事务操作

 更新时间:2024年03月20日 09:27:02   作者:笑道三千  
这篇文章主要介绍了MySQL中的多表查询与事务操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

一,多表联查

有些数据我们已经拆分成多个表,他们之间通过外键进行连接.当我们要查询两个表的数据,各取其中的一列或者多列.

这时候就需要使用多表联查.

数据准备:

# 创建部门表
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('新密码');

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。 

相关文章

  • 浅谈MySQL中的group by

    浅谈MySQL中的group by

    这篇文章主要介绍了MySQL中的group by,MySQL的group by用于对查询的数据进行分组;此外MySQL提供having子句对分组内的数据进行过滤。下面来看看文章对此的具体介绍,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • MySQL5.5版本安装与安装失败详细讲解

    MySQL5.5版本安装与安装失败详细讲解

    MySQL是一款安全、跨平台、高效的,并与PHP、Java等主流编程语言紧密结合的数据库系统,下面这篇文章主要给大家介绍了关于MySQL5.5版本安装与安装失败详细讲解的相关资料,需要的朋友可以参考下
    2023-03-03
  • mysql存储过程原理与使用方法详解

    mysql存储过程原理与使用方法详解

    这篇文章主要介绍了mysql存储过程原理与使用方法,结合实例形式详细分析了mysql存储过程的优缺点、定义、调用方法及相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • MySQL?binlog格式之Row和Statement语句详解

    MySQL?binlog格式之Row和Statement语句详解

    这篇文章主要为大家介绍了MySQL?binlog格式之Row和Statement语句详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • mysql 忘记密码的解决方法(linux和windows小结)

    mysql 忘记密码的解决方法(linux和windows小结)

    下面是linux和windows下mysql丢失密码的解决办法
    2008-12-12
  • Linux下安装与使用MySQL详细介绍

    Linux下安装与使用MySQL详细介绍

    以下是对在Linux下安装与使用MySQL进行了详细的介绍,需要的朋友可以过来参考下
    2013-08-08
  • mysql如何配置白名单访问

    mysql如何配置白名单访问

    这篇文章主要介绍了mysql配置白名单访问的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • sql 流水号获取代码实例

    sql 流水号获取代码实例

    这篇文章主要介绍了sql 流水号获取代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 解决MySQL?Varchar?类型尾部空格的问题

    解决MySQL?Varchar?类型尾部空格的问题

    这篇文章主要介绍了MySQL?Varchar?类型尾部空格,在这里需要注意的是?binary?排序规则的?pad?属性为?NO?PAD,这里其实不是个例外,因为?char、varchar?和?text?类型都归类为?nonbinary,感兴趣的朋友跟随小编一起学习下吧
    2022-04-04
  • MySQL学习之数据库操作DML详解小白篇

    MySQL学习之数据库操作DML详解小白篇

    本篇文章非常适合MySQl初学者,主要为大家讲解了MySQL数据库的常用操作,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家早日进步升职加薪
    2021-09-09

最新评论


http://www.vxiaotou.com