外連接(outer join)
left join:左外連接(左連接)琐脏,以左表為主表
right join:右外連接(右連接)攒砖,以右表為主表
基本語法:左表 left/right join 右表 on 左表.字段=右表.字段;
-- 左連接
select s.*,c.name as c_name,c.room -- 字段的別名
from my_student as s left join my_class as c -- 左表為主表日裙,最終記錄數(shù)至少不少于左表已有的記錄數(shù)
on s.c_id=c.id;
-- 右連接
select s.*,c.name as c_name,c.room -- 字段的別名
from my_student as s right joinmy_class as c -- 右表為主表,最終記錄數(shù)至少不少于右表已有的記錄數(shù)
on s.c_id=c.id;
-- 左右連接互轉(zhuǎn)
select s.*,c.name as c_name,c.room -- 字段的別名
from my_class as c right join my_student as s -- 右表為主表昂拂,最終記錄數(shù)至少不少于右表已有的記錄數(shù)
on s.c_id=c.id;
自然連接(natural join)
自然內(nèi)連接:左表 natural join 右表;
自然外連接:左表 natural left/right join 右表;
模擬自然連接:左表 left/right/inner join 右表 using(字段名);
-- 自然內(nèi)連接
select * from my_student natural join my_class;
-- 修改班級(jí)表的name字段名為c_name
alter table my_class change name c_name varchar(20) not null;-- alter table my_class change c_name name varchar(20) not null;(修改班級(jí)表的c_name字段名為name)
-- 自然左外連接(基本不用)
select * from my_student natural left join my_class;
-- 外連接模擬自然外鏈:using
select * from my_student left join my_class using(id);
新增外鍵
創(chuàng)建表的時(shí)候增加外鍵:在所有的表字段之后受神,使用foreign key(外鍵字段) references 外部表(主鍵字段)
在新增表之后增加外鍵:修改表結(jié)構(gòu)格侯,使用alter table 表名 add [constraint 外鍵名字] foreign key(外鍵字段) references 父表(主鍵字段);
-- 創(chuàng)建外鍵
create table my_foreign1(
id int primary key auto_increment,
name varchar(20) not null comment '學(xué)生姓名',
c_id int comment '班級(jí)名', -- 普通字段
-- 增加外鍵
foreign key(c_id) references my_class(id)
)charset utf8;
追加外鍵
-- 創(chuàng)建表
create table my_foreign2(
id int primary key auto_increment,
name varchar(20) not null comment '學(xué)生姓名',
c_id int comment '班級(jí)名' -- 普通字段
)charset utf8;
-- 增加外鍵
alter table my_foreign2 add
-- 指定外鍵名
constraint student_class_1
-- 指定外鍵字段
foreign key(c_id)
-- 引用父表主鍵
references my_class(id);
刪除外鍵
-- 刪除外鍵
alter table my_foreign1 drop foreign key
my_foreign1_ibfk_1;
在結(jié)構(gòu)上看不出來诵竭,要從建表語句來看
外鍵條件
????????????外鍵要存在谭跨,首先必須保證表的存儲(chǔ)引擎是innodb
????????????列類型必須與父表的主鍵類型一致
????????????一張表中的外鍵名字不能重復(fù)
????????????增加外鍵的字段數(shù)據(jù)已經(jīng)存在则吟,必須保證數(shù)據(jù)與父表主鍵要求對(duì)應(yīng)
-- 插入數(shù)據(jù):外鍵字段在父表中不存在
insert into my_foreign2 values(null,'郭富城',5); -- 沒有5班級(jí)
insert into my_foreign2 values(null,'項(xiàng)羽',1);
insert into my_foreign2 values(null,'劉邦',2);
insert into my_foreign2 values(null,'韓信',2);
-- 更新父表記錄
update my_class set id=5 where id=1; -- 失敗:id=1的班級(jí)記錄已經(jīng)被學(xué)生引用
update my_class set id=5 where id=3; -- 可以:沒有引用
-- 插入數(shù)據(jù)
insert into my_foreign1 values(null,'馬超',3);
-- 增加外鍵
alter table my_foreign1 add foreign key(c_id)
references my_class(id);
外鍵約束
有三種約束模式
? district:嚴(yán)格模式(默認(rèn)的)
?cascade:級(jí)聯(lián)模式
????????set null:置空模式
語法:
foreign key(外鍵字段) references 父表(主鍵字段) on delete 模式 on update 模式;