连接查询;外键

连接查询

连接查询(join)分类:内连接、外连接、自然连接、交叉连接

使用方式:左表 join 右表

交叉连接(cross join)

无条件匹配,都成功

基本语法:左表 cross join 右表; -- 等价于:from 左表,右表;

内连接([inner] join)

基本语法:左表 [inner] join 右表 on 左表.字段=右表.字段;

on表示连接条件

匹配条件:满足条件才可以保留

内、外连接常用

外连接(outer join)

left join:左外连接(左连接),以左表为主表

right join:右外连接(右连接),以右表为主表

基本语法:左表 left/right join 右表 on 左表.字段=右表.字段;


自然连接(natural join)

自然内连接:左表 natural join 右表;

自然外连接:左表 natural left/right join 右表;

模拟自然连接:左表 left/right/inner join 右表 using(字段名);

外键

1、增加外键

创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

在新增表之后增加外键:修改表结构,使用alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

修改外键&删除外键(不能修改,只能删除完,再添加)

alter table 表名 drop foreign key 外键名;

删除外键通过查看表的创建语句来体现

2、外键条件(2,3条重要)

      1)外键要存在,首先必须保证表的存储引擎是innodb

2)列类型必须与父表的主键类型完全一致

3)一张表中的外键名字不能重复

4)增加外键的字段数据已经存在,必须保证数据与父表主键要求对应

-- 更新父表记录

update my_class set id=5 where id=1; -- 外键约束失败:因为id=1的班级记录已经被学生引用

update my_class set id=5 where id=3; -- 可以:没有引用

外键约束失败


外键约束失败

 /3、外键约束(作用)

有三种约束(对父表的约束)模式

district:严格模式(默认的--父表不能更新或删除一个被子表引用的班)

cascade:级联模式(父表更新,子表也跟着更新)

set null:置空模式(删除时把子表置空)

语法:foreign key(外键字段) references 父表(主键字段) on delete 模式 on update 模式;


-- 创建外键:指定模式:删除置空,更新级联

create table my_foreign3(

id int primary key auto_increment,

name varchar(20) not null,

c_id int,

-- 增加外键

foreign key(c_id)

-- 引用表

references my_class(id)

-- 指定删除模式

on delete set null

-- 指定更新模式

on update cascade

)charset utf8;

-- 插入数据

insert into my_foreign3 values(null,'唐三',1),

(null,'小舞',1),

(null,'奥斯卡',1),

(null,'马红俊',2),

(null,'宁荣荣',2);

-- 解除my_foreign2表的外键(严格模式)

alter table my_foreign2 drop foreign key

student_class_1;

-- 更新父表主键

update my_class set id=3 where id=1;

-- 删除父表主键

delete from my_class where id=2;

你可能感兴趣的:(连接查询;外键)