外键
外键是一个约束
关键字:foreign key
学生信息和老师的信息?
为什么是两个表?
如果把两个不同类型的数据放到一个表中 那么维护性将变得很差
所以我们在设计表的时候 会把不同类型的数据分别储存到不同的表中
判断表与表的关系
一个表的非主键列 是另一个表的主键 那么认为这两个表是有关系的表
# 一旦设置了外键关系 那么一定有主次之分
# 外键是建立在次表中
# 主表不能删除数据 次表能删除数据
# 主表能不能删除数据和外键的动作有关系
# 外键的关系列名 不一定是一样的
作用1:让表与表之间建立联系~~
作用2:可以限制次表中外键列的数据存储
次表的外键列的取值范围只能在主表的外键列之中
设置外键的语法:
表已经创建好之后 设置外键
# constraint 外键名 可以不写 会自动生成 但是名字很复杂
# on update 动作 on delete 动作; 如果不写 默认是restrice动作
alter table 表名 add constraint 外键名 foreign key(列名) references 主表名称(列名) on update 动作 on delete 动作;
创建表的时候设置外键
create table 表名(
列1,
列2,
列3,
....,
constraint 外键名 foreign key(列名) references 主表名称(列名) on update 动作 on delete 动作
);
# 查询外键
show create table 表名;
# 删除外键
alter table 表名 drop foreign key 外键名;
# 外键的动作
set null: 当删除或者更新主表的外键列时 次表的外键列会被设置为null (次表的列 允许为null)
cascade: 级联 当主表的外键列更新或者删除的时候 次表的外键列也会跟着变化
restrice: 默认的动作 不允许删除或者更新主表的数据~~~
动作分两种类型
1.更新 update
2.删除 delete
子查询
在select语句中, 嵌套另一个select语句
在where子句中 , 嵌套一个select语句
as:对表名或者字段名进行重命名(区别名)
-- 在select语句中, 嵌套另一个select语句
-- 查询得到的结果作为一个新的表 吗交给外层查询 , 此时得到的新版用as对器进行取名 , 方便后续操作
select * from (select * from 表名 where 条件) as 表名 where 表名.条件;
-- 在where子句中 , 嵌套一个select语句
-- 查询得到的结果必须是一个确切的数据 , 不能是多行多列的表格 , 返回的结果就是交给外层进行条件筛选
select * from 表名 where 条件(select * from 表名 where 条件);
联结表
联结表 就是把有关系的表拼接成一个表来进行查询
inner join -- 内连接
left join -- 左连接
right join -- 右连接
-- 内连接 , 将两表关联的数据拼接在一起
select * from 表1 inner join 表2 on 连接条件
select * from book inner join author
on book.b_id=author.a_id;
select book.b_name,author.a_name from book
inner join author on book.b_id=author.a_id;
-- 左连接 , 以左表为主 ,左表有数据没有对应到 , 会出现为NULL
select * from (左)表1 left join 表2 on 连接条件
select * from author left join book
on book.b_id=author.a_id;
-- 右连接 , 以右表为主, 右表有数据没有对应到 , 会出现为NULL
select * from (左)表1 right join 表(右)2 on 连接条件
select * from author right join book
on book.b_id=author.a_id;
自然联结
在一个表中 有联结关系的多个列 可以使用自然联结来解决这个问题
模拟多表查询。 自然联结可以把一个表当成两个表来查询。