MySQL多表(理论知识总结)
1. 多表关系
外键 foreign key
添加外键语法: alter table 表名1 add foreign key(外键名称) references 表名2(主键名称)
2.三种表关系:
一对多
在多的一方建立外键 指向一方的主键
多对多
建立中间表 存储外键分别指向其他表的主键
一对一
可以建立唯一 unique约束 让其中一张表的外键指向另一张表的主键(少见)
3.多表查询语法
交叉连接查询: 查询出来的是两张表的每一条记录进行匹配的结果 会出现笛卡尔积
select * from tb1 cross join tb2;
select * from tb1 , tb2;
内连接:
select * from tb1 inner join tb2 on 条件; 显示内连接
select * from tb1 , tb2 where 条件; 隐式内连接
外连接:
左外连接 select * from tb1 left outer join tb2 on 条件; 查询左表所有和两张表的共有部分
右外连接 select * from tb1 right outer join tb2 on 条件; 查询右表所有和两张表的共有部分
4.子查询: 一条select语句的执行依赖于另一条select语句
select * from 表名 in/exists/all/any (select *...)
5. 练习题计算企业每年营业额的增长率
SELECT * FROM annual_income a1,annual_income a2 WHERE a1.year=(a2.year+1);(按照要求找到两张表的关系)
SELECT * FROM annual_income a1 LEFT JOIN annual_income a2 ON a1.year=(a2.year+1);(查询第一张表和所有的)
SELECT a1.year,CONCAT(ROUND(IFNULL(((a1.zz-a2.zz)/a2.zz)*100,0),0),'%') 增长率 FROM annual_income a1 LEFT JOIN annual_income a2 ON a1.year=(a2.year+1);(最终的结果)
6 事务: 指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。
事务特性:
原子性/一致性/隔离性/持久性
如果不考虑事务的隔离级别 在进行操作时有可能出现问题:
脏读/不可重复读/虚读
事务可以设置的隔离级别:
read uncommitted 读未提交
read committed 读已提交
repeatable read 可重复读
serializable 串行化