黑马程序员技术交流社区

标题: 学习经历 [打印本页]

作者: 汪一汪    时间: 2019-4-18 15:06
标题: 学习经历
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:全部能够解决

        




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2