一、外键
关键字:foreign key
1. 表与表之间的关系
如何找出两表之间的关系:
分析步骤:
1、先站在左表的角度去找
判断左表的一条记录是够能够对应右表中的多条记录,如果能,左表的一个字段 foreign key 右表的一个字段
2、 再站在右表的角度去找
判断右表中的一条记录是否能够对应左表中的多条记录,如果能,右表的一个字段foreign key 左表的一个字段
总结:
一对多:如果只有步骤一成立,步骤二不成立或步骤二成立,步骤一不成立,那就是一对多关系
多对多:如果步骤1和步骤2同时成立,则证明这两张表是多对多关系
一对一:如果步骤1和步骤2都不成立,而左表中的一条数据对应右表中的一条数据,那两表就是一对一的关系
2. 建立表与表之间关系的注意事项
1. 创建表示先创建被关联的的表(没有外键的表),然后在创建关联的表
2. 插入新数据时,应该确定被关联表中有数据
3. 在插入新数据的时候,外键字段只能填写被关联表中已经存在的数据
4. 在修改和删除被关联表中的数据时,无法直接操作,要想数据之间自动修改和删除需要添加额外的设置
3. 建立表与表之间的关系
第一种:
一对多:关联方式:foreign key
create table dep(id int primary key auto_increment,name varchar(32)); create table emp(id int primary key auto_increment,name varchar(32),age int,dep_id int,foreign key(dep_id) references dep(id) on update cascade on delete cascade); insert into dep(name) values('技术部'),('人事部'); insert into emp(name,age,dep_id) values('张三',18,1),('李四',19,2);
第二种:
多对多:关联方式:foreign key + 一张表
第三种:
一对一:关联方式:foreign key + unique
create table user(id int primary key,name varchar(32)); create yable userinfo(id int primary key auto_increment,qq int,email int,user_id int unique,foreign key(user_id) references user(id) on update cascade on delete cascade); insert into user(name) values('张三'),('李四'); insert into userinfo(qq,email,user_id) values(1211111,1111111,2),(11218476,19894765,4);
二、多表查询
方法1:子查询(分布操作)
子查询:一条SQL语句的执行结果作为另一条SQL语句的执行条件
例:select*from dep where id = (select dep_id from emp where name = 'kevin');
方法2:连表查询(重点)
连表查询:把多张有关系的表链接成一张巨大的虚拟表,链接出来的虚拟表不是真实存在的,它在内存中存着,然后按照单表查询
专业的连表语法:
inner join :内连接,查询的是两张表中都有的数据
left join :左连接,以左表为基准,查询左表中的所有数据,右表没有的数据,用NULL连接
right join :右连接,以右表为基准,查询右表中的所有数据,左表没有的数据,用NULL连接
union :连接两个SQL语句的结果
例句:select*from dep left join emp on emp.id = dep.id;
union
select*from dep right join left on emp.id=dep.id;
连表查询可以查看多张表,不止两张表