1.多表查询
什么是什么多表查询?
查多张表,查询出来的结果是两张表组合在一起的集合
多表查询的分类?
笛卡尔积查询(最简单的多表查询,是建立在一切多表查询基础之上的)
select * from a,b;
内连接查询
隐式内连接查询
select * from a, b where a.id = b.id;
显示内连接查询
select * from a inner join b on a.id = b.id;
说明:不管是显示还是隐式,结果一模一样,用哪个,看你心情
外连接查询
左外连接查询
select * from a left join b on a.id = b.id;
select * from b left join a on a.id = b.id;
右外连接查询
select * from a right join b on a.id = b.id;
select * from b right join a on a.id = b.id;
子查询
select name from a where id = (select id from b where name = '李四');
子查询可以对表进行重构
--需求:查询a表中的所有信息,id值降序排列(单表查询)
select * from a order by id desc;
--需求:查询a表中的所有信息,id值降序排列(子查询)
select newA.* from (select * from a order by id desc) newA;
说明:子查询嵌套的位置,1.where的后面 2.from的后面,where的前面
自连接查询
自己跟自己查
2.事务
什么是mysql中的事务?
就是我们要做的一个事情,可能做这个事情只需要一条sql语句,也可能涉及到多条sql语句
比如:给id值为1的那条记录修改下名字,这个事情只需要一条sql语句就可以完成
比如:转账,张三给李四转100,至少需要两条sql语句
最终结果:如果成功了,那就每条sql语句都成功
如果失败了,那就是每条sql语句都失败
事务的操作?
开启事务:start transaction
回滚事务:rollback
提交事务:commit
默认情况下,在我们执行一条sql语句之前,系统会自动开启事务,执行完之后,会自动提交事务
如果我们想要将多条sql语句放入到一个事务中,那就不能使用系统默认方式了
解决方案一:我们要手动开启(start transaction),手动提交(commit)即可
解决方案二:修改系统默认提交方式,默认是自动提交,只要改成手动提交(set @@autocommit = 0)
事务的隔离级别?
多线程并发访问数据会引发以下几种问题?
脏读:事务A 读到了 事务B 未提交的数据
不可重复读:事务A 读到了 事务B 已经提交的修改(update)后的数据
虚读(幻读):事务A 读到了 事务B 已经提交的增加(insert)后的数据
解决方案,就是我们要设置隔离级别,那隔离级别有哪些呢?
read uncommitted:可能会引发脏读,不可重复读,虚读
read committed:能够解决脏读,可能会引发不可重复读,虚读
repeatable read:能够解决脏读,不可重复读,可能会引发虚读(概率很低,几乎看不到虚读的效果)
serializable:全部能够解决
|
|