一.连接查询:将多张表联合查询(按照某个指定的条件进行拼接)
1.连接查询的分类:交叉连接
1):交叉连接:从一张表中循环取出每一条记录,然后去另一张表中匹配(无条件匹配)
select * from student cross join class; select * from student,my_class;
2):内连接:从左表中取出每一条记录去匹配右表中的数据
select * from student inner join my_class on student.id=my_class.id;
给标起别名进行查询: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):外连接:以某张表为主取出里面每一条记录,去匹配另一张表不管是否匹配成功都会保留,能正确匹配保留,不能正确匹配至空。
1.left join:左外连接以左表为主
2.right join:右连接以右表为主
3.基本语法:左表 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关键字可以将左右两表相同字段作为连接条件。
4):自然内连接:natural join,系统以字段自动匹配连接条件(如果有多个同名字段,那都将作为匹配条件),连接后会合并同名字段。
1.自然内链接 左表 natural join 右表;
2.自然外联结 左表 natural left/right 右表;
select * from student natural left join my_class;
二.外键:一张表的非主键关联另一张表的主键,外键在子表中
1.在创建表时增加外键:create table test_foreign(
-> id int(4) primary key auto_increment,
-> name char(8) comment '学生姓名',
-> c_id int(4) not null,
-> foreign key(c_id) references my_class(id)
-> );
2.在创建表之后增加外键: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.总结:对子表对父表(子表外键所在的表)
1):对子表进行约束,子表对数据进行(增改时),如果对应的外键字段在不到父表中找不到对应的匹配,操作会失败
(约束对子表的数据操作)
2):对父表的约束进行读写操作时(删改涉及主键操作),如果对应的主键在子表中已经被引用,那么操作会失败
3):外键类型必须和父表中主键类型一致如果不一致外键不会创建成功
4):增加外键的字段(数据以存在),必须保证于主键数据相互对应。
5):外键的三种约束模式(针对父表约束)
1.distract严格模式(默认约束):父表不能对删除或更新一个对子表已经引用的的数据
2.cascade 级联模式:父表的操作子表也跟着操作,指标关联性数据被删除
3.set null(制空模式):父表操作之后子表对应的数据被制空
通常一个合理的做法(约束模式):删除时子表制空,更新时子表级联操作
指定模式的语法:
foreign key(子表字段) reference 父表(主键字段) on delete 模式 update 模式;