第五章
外键:有外键的那个表是从表,另一个是主表;被引用的那个列应该具有主键约束或唯一性约束。建立外键的表必须是InnoDB,不能是临时表,因为mysql中只有InnoDB类型的表才支持外键
添加外键约束:
alter table 表名 constraintFK_ID foreign key (外键字段名) references 外键表名 (主键字段名);
[on delete {cascade | set null | no action | restrict }]
[on update {cascade | set null | no action | restrict }]
alter tablestudent add constraint FK_ID foreign key (gid) references grade (id);
cascade:删除包含与已删除键值有参照关系的所有记录
set null:修改包含与已删除键值有参照关系的所有记录,使用null值替换(不能用于已标记为not null的字段)
no action:不进行任何操作
restrict:拒绝主表删除或修改外键关联列。(在不定义on delete和no update子句时,这是默认设置,也是最安全的设置)
删除外键约束:
altertable 表名 drop foreign key 外键名;
altertable student drop foreign key FK_ID;
关联关系:
多对一(员工对部门)、多对多(学生对选修课)、一对一(个人对身份证)
添加数据:
添加数据时,要先为主表添加数据,然后为从表添加数据
删除数据:
删除数据时,要先删除从表数据,再删除主表数据
连接查询:
交叉连接:
select* from 表名1 cross join 表名2 ;
select* from from department cross join employee;
内连接:
select查询字段 from 表1 [inner] join 表2 on 表1.关系字段=表2.关系字段;
selectdepartment.dname,employee.name from department [inner] join employee ondepartment.did=employee.id;
自连接查询:查询自己所在的那个部门还有哪些员工
selectp1.* from employee p1 join employee p2 on p1.did=p2.did where p2.name=’Jim’;
外连接:
左连接:返回包括左表中的所有记录和右表中符合连接条件的记录
selectdepartment.did,department.dname,employee.name from department left joinemployee on department.did=employee.did;
右连接:返回包括右表中的所有记录和坐标中符合连接条件的记录
select department.did,department.dname,employee.namefrom department right join employee on department.did=employee.did;
符合条件连接查询:将内连接查询结果按照年龄排序
selectemployee.name,employee.age,department.dname from department join employee ondepartment.did=employee.did order by age;
子查询:
带in关键字的子查询:
select * from department where did [not] in(select did from employeewhere age=20;);
带exists关键字的子查询:
select* from department where exists(select did from employee where age>21);
带any关键字的子查询:只要外面查询出的值大于子查询出来的任意一个值,就返回
select* from department where did>any(select did from emplyee);
带all关键字的子查询:只有外面查询出来的大于全部子查询出来的值,才返回
select* from department where did>all(select did from employee);
带比较运算符的子查询:
select* from department where did=(select did from employee where name=’zhaosi’);