1.连接查询-笛卡尔乘积
笛卡尔乘(ab表相乘)积(得到的结果)现象:如果现在有两张表 A表有N条数据,B表有M条数据;在没有使用任何有效的条件的情况下,使用 语句 select * from a,b 得到的结果是 N*M条数据的一张表。
查询语法92年定了一个规则,99年定了一个规则;
内连接 :A,B两张表都为主表 92年语法是先乘积产生笛卡尔积,然后从笛卡尔乘积结果中筛选符合条件的记录;99年语法 inner join 是 从A,B表中 通过连接条件 拼接成一张新的表,取出两张表中能通过连接条件关联到一起的记录,如A表 1-10 a-c,B表的记录1-10 E- F,取出来的数据是 1-10;
99年外连接: left join 是把left join左边的表作为主表,根据连接条件,拿左表的记录去右表 找到符合条件的右表数据,放到查询结果的新表中,匹配不到 左表添加空值拼接。
select 条件 from A表 left jion B表
on 连接条件
where 筛选条件
group by 分组条件
(having 分组后的筛选条件)
order by 排序条件
使用左连接的时候,如果连接条件都唯一,不会产生笛卡尔乘积,如果非主表不唯一的情况 ,这个不唯一的记录,会产生局部的笛卡尔乘积,主表不唯一不会产生笛卡尔乘积
studnet 表 name studnetid; a,1 b 2,c 3,d 3
teacher表 studentid teacher; 1,t1,2.t2 3,t3 4,t4
结论:,如果非主表不唯一的情况 ,这个不唯一的记录,会产生局部的笛卡尔乘积,主表不唯一不会产生笛卡尔乘积
2.事务的隔离级别
事务是计算机术语,含义是 一条sql语句或者多条sql语句 在执行的时候,将他们作为一个整体,期望的结果呢 sql语句全部执行(且成功) 或者是 都没执行;多条sql语句中这些sql之间是依赖关系,如果有一条sql语句没有执行或者执行失败,这个整体能都进行回滚,数据库中的数据回到初始未执行这些sql的状态,牵一动全身;
事务的特性:
原子性:事务是个整体不可以分隔,原子的定义就是不可分隔的最小单元(定义之前是,现在原子是可以分隔了 )。
一致性:事务执行前后,数据库中的数据是完整的。数据库中的数据关系从一种完整性(一致)状态 变成了另外一种完整性(一致)状态
隔离性:多个事务可以同时执行,他们之间不相互影响。
持久性:事务一旦执行成功,会永久性改变数据库中的数据。
navicat 中执行事务:
mysql 默认的情况开启自动提交功能,默认每一条语句就是一个事务,所以无法把多条sql作为一个整体 进行事务执行;
myql有个把单个sql作为一个事务进行提交的功能。
show VARIABLES like 'autocommit' 查看自动提交配置
set autocommit = 0; 关闭自动提交功能
sql1
sql2 ,,,
结束事务
commit(提交事务)/rollback(回滚事务)
事务并发执行产生的问题: 多事务并发执行 并且访问相同数据库中相同的数据
脏读:A事务读取了B事务更新了但是未提交的字段数据,如果B事务回滚了,那么A读取的这个字段数据就是临时且无效的数据。
不可重复读: A事务读取了字段数据两次,这两次正好是B事务更新这个字段数据前后。所以A读取的这个字段数据前后两次不一致。
幻读:A事务读取表中的数据,B事务那对表行数进行了删除或者增加,导致A事务再次读取的行数的时候发现行数多了或者少了。
事务的隔离性 是解决事务并发产生问题的方法;
隔离级别的意思是 一个事务和其他事务的隔离程度(达到的效果),这个隔离程度越高,数据的一致性越高,然而并发性越弱。
事务的隔离级别:
1.读未提交:事务A开启,事务B可以读取事务A未提交的数据,未提交意味着这个字段数据可以回滚,那么会产生,脏读,不可重复读,幻读
2.读已提交:事务A开启,事务B只能读取事务A已经提交的数据,数据提交,意味着这个字段数据已经永久改变,A事务数据不会回滚,所有不存在脏读;不可重复读会存在,事务B第一次读取数据是事务A未提交之前的字段数据,第二次读取字段数据是事务A提交后的数据;同理 幻读的存在是 A事务对表中的行进行的增加;Oracle 默认的隔离级别就是读已提交
3.可重复读:一个事务中多次读取字段数据相同为可重复读,实现的效果,事务A开启,事务B开启,事务A读取字段数据两次,第一次B事务中操作这个字段尚未提交或者为操作这个字段, 第二次是B事务已经提交成功了(既然事务B能提交成功说明没有加锁),事务A读取的这个字段两次数据值相同;但是不支持幻读,事务A读取两次之间,如果事务B对表中中行进行了插入操作,那么事务A读取的行是不一样的,产生了幻读;Mysql的默认隔离级别就是可重复读
4.序列化:脏读,不可重复读,幻读都能解决;类似于线程同步,A事务执行期间,禁止B事务无法执行sql语句;解决了所有并发问题但是性能差。
查看数据库的隔离级别:select @@transaction_isolation;
3.p188 sql性能
4.p192索引
5.p241 主从复制
6.p331sql预热
7.p345 主从复制 分库分表