连接查询
连接查询(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;