子查询
子查询的概念:
1、一个查询的结果作为另一个查询的条件
2、有查询的嵌套,内部的查询称为子查询
3、子查询要使用括号
子查询的结果分为三种:
1、结果是单行单列,肯定在where后面作为条件,父查询使用:比较运算符,如>,<,<>,=等
select max(salary) from emp;
select * from emp where salary = (select max(salary) from emp);
2、子查询结果是多行单列,结果集类似于一个数组,父查询使用in运算符
select dept_id from emp where salary > 5000;
select name from dept where id in (select dept_id from emp where salary > 5000);
3、子查询结果是多行多列,肯定在from后面作为表
select * from emp where join_date >= '2011-1-1';
select * from dept d, (select * from emp where join_date >= '2011-1-1') e where d.`id` = e.dept_id;
事务
什么是事务:
在实际的开发过程中,一个业务操作,如转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户价钱。其中有一条SQL语句出现异常,这条SQL就可能执行失败。
事务执行是一个整体,所有的SQL语句都必须成功,如果其中有一条SQL语句出现异常,则所有的SQL语句都要回滚,整个业务执行失败。
手动提交事务:
开启事务:start transaction
提交事务:commit
回滚事务:rollback
手动提交事务使用的过程:
执行成功的情况:开启事务->执行多条SQL语句—>成功提交事务
执行失败的情况:开启事务—>执行多条SQL语句—>事务的回滚
自动提交事务:
MYSQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MYSQL默认开始自动提交事务。
取消自动提交事务:select @@autocommit
回滚点:
在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面的操作都已经成功了,可以在当前成功的位置设置一个回滚点,可以供后续失败操作返回到该位置 ,而不是返回所有操作,这个点称之为回滚点。
设置回滚点:savepoint
回到回滚点:rollback to
设置回滚点可以让我们在失败的时候回到回滚点,而不是回到事务开启的时候
事务的隔离级别:
事务的四大特性:
1、原子性:每个事务都是一个整体,不可再拆分,事务中的所有SQL语句要么执行成功,要么都失败
2、一致性:事务在执行前数据库的状态与执行后数据库的状态保持一致
3、隔离性:事务与事务之间不应该相互影响,执行时保持隔离的状态
4、持久性:一旦事务执行成功,对数据库的修改都是持久的
事务的隔离级别:
事务在操作时的理想状态:所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问一个数据。可能会引发并访问的问题:
1、脏读:一个事务读取了另一个事务中尚未提交的数据
2、不可重复读:一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题
3、幻读:一个事务中两次读取的数据的数量不一致,要求在一个事务中多次读取的数据的数据量是一致的。
MYSQL数据库的四种隔离级别
上面