连接查询是同时查询多张表,通过多张表之间的关系得到最终的结果。连接查询又分成内连接、外链接和自然连接。
内连接:从左表中取出每一条记录,去右表中与所有的记录进行匹配;匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。
注意内连接可以没有on之后的条件,此时查询的结果是笛卡尔积。
外连接:以某张表为主表,取出主表中的所有记录,然后每一条记录都与另外一张表进行连接。主表中的结果将全部保留,从表中内匹配的结果保留,不能匹配的结果都将置为null。
外连接分成两种,左外连接(left join)和右外连接(right join)
自然连接:自动匹配连接条件,系统将以字段名字作为匹配模式(同名字段作为条件)。自然连接分成自然内连接和自然外连接。
-- 自然内连接
select * from s_user natural join s_orderform;
-- 自然左外连接
select * from s_user natural left join s_orderform;
--自然右外连接
select * from s_user natural right join s_orderform;
使用内连接和外连接来模拟自然连接:
左表 left/right join 右表 using(字段名);
MySQL中增加外键(两种方式):
方式一,在创建表的同时指定外键
-- 创建父表
create table my_class(id int primary key auto_increment,c_name varchar(20) not null,room varchar(20))charset utf8;
--引用外键创建表
create table my_foreign1(id int primary key auto_increment,name varchar(20) not null comment '学生姓名',c_id int comment '班级id',foreign key(c_id) references my_class(id))charset utf8;
方式二:在创建完表之后增加外键:
语法:alter table 表名 add (constraint 外键名字) foreign key(外键字段) references 父表(主键字段);
create table my_foreign2(id int primary key auto_increment,name varchar(20) not null comment '学生姓名',c_id int comment '班级id')charset utf8;
alter table my_foreign2 add constraint student_class foreign key(c_id) references my_class(id);
删除外键:
alter table 表名 drop foreign key 外键名字
alter table my_foreign1 drop foreign key my_foreign1_ibfk_1;
注意:
要使外键创建成功,首先要保证表的存储引擎是innodb(否则即使创建成功也不会有效果)。
注意外键的列类型必须和父表的主键列类型相一致。
外键有三种模式:
District:严格模式(默认的),父表不能更新或删除一个字表已经引用的记录。
cascade:级联模式,父表删除被引用的字段同时字表也会跟着删除引用的字段。
set sull:置空模式,父表删除被引用的字段同时字表会将引用的字段置为空。
通常是将更新的时候模式设置为cascade,删除的时候将模式设置为set null;
指定模式的语法:
foreign key(外键字段) references 父表(主键字段) on delete set null update cascade;