SQL高级(二)
一.連接查詢:將多張表聯(lián)合查詢(按照某個(gè)指定的條件進(jìn)行拼接)
???????????? 1.連接查詢的分類:交叉連接
??????????????????????? 1):交叉連接:從一張表中循環(huán)取出每一條記錄,然后去另一張表中匹配(無(wú)條件匹配)
????????????????????????????? select * from student cross join class; ????select * from student,my_class;
??????????????????????? 2):內(nèi)連接:從左表中取出每一條記錄去匹配右表中的數(shù)據(jù)
????????????????????????????? select * from student inner join my_class on student.id=my_class.id;
????????????????????????????? 給標(biāo)起別名進(jìn)行查詢:select * from student as s inner join my_class as my on s.id=my.id;
????????????????????????????? select s.id,s.name,s.sex,s.age,my.room,my.teacher from student as s inner join my_class as my where s.id=my.id;
?????????????????????? 3):外連接:以某張表為主取出里面每一條記錄,去匹配另一張表不管是否匹配成功都會(huì)保留,能正確匹配保留,不能正確匹配至空。
??????????????????????????????? 1.left join:左外連接以左表為主
??????????????????????????????? 2.right join:右連接以右表為主
??????????????????????????????? 3.基本語(yǔ)法:左表?? left/right?? join? 右表?? on 左表.字段=右表.字段;
????????????????????????????????????select s.id,s.name,s.sex,s.age,my.room,my.teacher from student as s left/right join my_class as my on s.id=my.id;
??????????????????????????????????? select * from student? left join my_class using(id);//使用using關(guān)鍵字可以將左右兩表相同字段作為連接條件。
?????????????????????? 4):自然內(nèi)連接:natural join,系統(tǒng)以字段自動(dòng)匹配連接條件(如果有多個(gè)同名字段,那都將作為匹配條件),連接后會(huì)合并同名字段。
????????????????????????????????? 1.自然內(nèi)鏈接 左表 natural join 右表;
????????????????????????????????? 2.自然外聯(lián)結(jié) 左表 natural left/right 右表;
????????????????????????????????? select * from student natural left join my_class;
二.外鍵:一張表的非主鍵關(guān)聯(lián)另一張表的主鍵,外鍵在子表中
??????????????? 1.在創(chuàng)建表時(shí)增加外鍵:create table test_foreign(
??????????????????????????????? -> id int(4) primary key auto_increment,
??? ????????????????????????????-> name char(8) comment '學(xué)生姓名',
??????????????????????????????? -> c_id int(4) not null,
??????????????????????????????? -> foreign key(c_id) references my_class(id)
??????????????????????????????? -> );
???????????????? 2.在創(chuàng)建表之后增加外鍵:alter table test_foreign add constraint c_id foreign key (c_id) references my_class (id);
???????????????? 3.刪除外鍵:alter table test_foreign drop foreign key test_foreign_ibfk_1;
???????????????? 4.總結(jié):對(duì)子表對(duì)父表(子表外鍵所在的表)
?????????????????????????????? 1):對(duì)子表進(jìn)行約束,子表對(duì)數(shù)據(jù)進(jìn)行(增改時(shí)),如果對(duì)應(yīng)的外鍵字段在不到父表中找不到對(duì)應(yīng)的匹配,操作會(huì)失敗
????????????????????????????????????(約束對(duì)子表的數(shù)據(jù)操作)
?????????????????????????????? 2):對(duì)父表的約束進(jìn)行讀寫操作時(shí)(刪改涉及主鍵操作),如果對(duì)應(yīng)的主鍵在子表中已經(jīng)被引用,那么操作會(huì)失敗
?????????????????????????????? 3):外鍵類型必須和父表中主鍵類型一致如果不一致外鍵不會(huì)創(chuàng)建成功 ?????????????????
?????????????????????????????? 4):增加外鍵的字段(數(shù)據(jù)以存在),必須保證于主鍵數(shù)據(jù)相互對(duì)應(yīng)。
?????????????????????????????? 5):外鍵的三種約束模式(針對(duì)父表約束)
?????????????????????????????????????????????? 1.distract嚴(yán)格模式(默認(rèn)約束):父表不能對(duì)刪除或更新一個(gè)對(duì)子表已經(jīng)引用的的數(shù)據(jù)
??????????????????????????????????????????????? 2.cascade 級(jí)聯(lián)模式:父表的操作子表也跟著操作,指標(biāo)關(guān)聯(lián)性數(shù)據(jù)被刪除
??????????????????????????????????????????????? 3.set null(制空模式):父表操作之后子表對(duì)應(yīng)的數(shù)據(jù)被制空
??????????????????????????????????????? 通常一個(gè)合理的做法(約束模式):刪除時(shí)子表制空,更新時(shí)子表級(jí)聯(lián)操作
??????????????????????????????????????? 指定模式的語(yǔ)法:
?????????????????????????????????????????????????? foreign key(子表字段) reference 父表(主鍵字段) on delete 模式 update 模式; ??????
????????????????????????????????
總結(jié)
- 上一篇: Mysql高级操作
- 下一篇: linux cmake编译源码,linu