黑马程序员技术交流社区

标题: Mysql [打印本页]

作者: Keai720    时间: 2019-6-21 11:34
标题: Mysql
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