Mysql进阶
SQL语句分类
DQL(数据查询语言):查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改查。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。
DCL(数据控制语言):grant授权、revoke撤销权限等。
简单查询:
1 | show databases; //查看所有的数据库 |
条件查询:
1 | select 字段名,字段名 from 表名 where 条件; |
in等同于or
1 | select ename,sal,comm,job from emp where sal in (2000,5000); //查询薪资为2000或5000的员工 |
模糊查询like:
在模糊查询中,有两个特殊的字符,一个是%,一个是_
1 | select ename,sal,comm,job from emp where ename like '%A%'; //找出名字中含有A的员工 |
排序
order by 默认是升序,asc表示升序,desc表示降序。
1 | select ename,sal,comm,job from emp order by sal asc; //查找所有的员工,按照工资升序排序 |
分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
1 | select sum(sal) from emp ; //工资总和 |
一.事务
1.什么是数据库事务?
事物是一个不可分割的数据库操作序列,也就是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态,事务是逻辑上的一组操作,要么全部执行,要么全部不执行。
和事务相关的语句:DML语句。(insert delete update)
事务的存在是为了保证数据的完整性和安全性。
一个事务需要多条DML语句共同联合完成。
2.事务(Transaction)的四大特性
原子性(Atomicity):一个事务不可再分割,事务中的所有操作,要么全部完成,要么全部不完成。
一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另外一致状态。也就是说,在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性(Isolation):一个事务所做的修改在最终提交之前,对其他事务是不可见的。也就是说一个事务的执行不会受到其它事务的干扰。
持久性(Durability):一个事务一旦提交以后,对数据的修改将会永久的保存到数据库中,即便系统故障也不会丢失。
3.事务的并发性问题?
什么时候会发生事务的并发性问题?
当多个事务同时操作同一个数据库的相同数据时,就会发生并发问题。
事务的并发性问题有哪些?
1)脏读(Dirty read):对于俩个事务A,B,A读取了已经被B更新但是还没有提交的数据。如果在这个时候,B进行了回滚,那么X1读取到的数据就是临时且无效的。
例子:有一天,事务A访问了数据库,事务A想把它的小弟加到数据库里面,就执行了sql语句
insert into users(表) values(4,'小弟')
,但是事务A并没有提交事务,然后这个时候,事务B来了,它要查询表里面的所有users的名字select name from users
,这个时候,因为事务没有隔离性,所以事务B会读取到小弟的名字,这个时候就叫脏读。
2)不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
例子:第二天,事务A访问了数据库,它要查看ID为1的用户的名字,于是执行了select name from users(表) where id = 1
,此时此刻,事务B来了,因为ID为1的用户改名字了,所以要进行更新,于是执行了update users(表) set name = '大弟子' where id = 1
;但是嘛,这个时候,事务A还想再看看ID为1的用户的名字,于是执行了select name from uses(表) where id = 1
,结果,俩次读取出来的名字是不一样的,这就是不可重复读。
3)幻读(Phantom Read)在一个事务的两次查询中数据条数不一致,例如一个事务查询了几列(Row)数据,而另一个事务却在此时插入了几列新的数据,先前的事务在接下来查询中,就会发现几列数据是它之前所没有的。
例子:第三天,事务A访问了数据库,它想要看看数据库的用户有哪些,于是执行了select*form users(表)
;这个时候,事务B来了,往数据库里面加入了它的小弟。执行了insert into users(表) values(4,'小弟')
;然后嘛,事务A把刚刚看到的用户有哪些忘记了,于是它又执行了select*form users(表)
;结果,第一次它查到的用户有3个,第二次竟查出来四个,搞得它一脸懵逼。这个就叫幻读。
二.悲观锁和乐观锁机制
Author: 小灰灰
Link: http://xhh460.github.io/2020/05/26/mysql%E8%BF%9B%E9%98%B6/
Copyright: All articles in this blog are licensed.