多表

多表

一个表的外键指向另一个表的一个主键(外键类型必须和主键一致,但名称可以不同)

create table department( id int primary key,name varchar(20));

create table emp(id int primary key, add varchar(20) , department int , constraint fk_empDp  emp( department ) references department(id);

多表关系种类

一对一

一对多

  • 建表时定义外键和指向

constraint fk_empDp emp( department ) references department(id);
CONSTRAINT 外键约束名(并非被指定为外键这一列的列名) 从表名(外键列名) REFERENCES 主表名(主键列名);

  • 表存在时添加外键

alter table emp add constraint fk_empDp Foreign Key emp(department) references department(id)
ALTER TABLE 从表名 add CONSTRAINT 外键约束名 从表名(外键列名) REFERENCES 主表名(主键列名);
当从表中外键列的值,主表主键中没有全部囊括时,无法添加外键

  • 删除外键
    alter table emp drop foreign key fk_empDp
    alter table 从表名 drop FOREIGN KEY 外键约束名

      当从表外键列中还有内容指向主键时,主键内容无法删除!
      即当emp表中还有员工的department为1时,department中id为1的部门就无法删除。
    

多对多

多对多关系:学生和课程(一个学生可以选多个课程;一个课程可以有多个学生选)

交叉查询

  • 交叉查询的结果混乱
    交叉查询---->将得到笛卡尔积
    (select * from 课程表1,学生表2
    课程有3行,学生(含外键id连接至课程表的id)有4行
    查询学生选课结果会有12行;每个学生会匹配每个课程产生一行结果)
  • 所以需要一张中间表,包含表1和表2的主键列,以及联合主键 PRIMARYKEY(表1的主键列名1,表2的主键PK列名2) 确保主键组合的结果唯一

例题:查询张三选了哪些课程

	SELECT NAME FROM tb_subj WHERE id IN (SELECT sub_id FROM  tb_subj_stu WHERE stu_id = (SELECT id FROM stu WHERE NAME='zs'))
	
	SELECT su.name,st.name FROM stu st,tb_subj su ,tb_subj_stu tss 
	WHERE  st.id= tss.stu_id AND  su.id=tss.sub_id AND st.name='zs' 

内连接查询

仅查询交集
select 字段列表 from 表1 inner join 表2 where 条件
select 字段列表 from 表1 ,表2 where 条件
select 字段列表 from join where 条件

外连接查询

select 字段列表 from 表1 left (outer可省略) join 表2 on 条件
select 字段列表 from 表1 right(outer可省略)join 表2 on 条件(必须写条件)

left以左表为主,right以右表为主,即便其主键值在表2中没有对应,也会出现在查询结果中(1列,内容为NULL)

	如图是 部门表 右外连接查询 员工表
	员工王八没有部门,还是会出现在查询结果(即查询结果包含右表的全部和2个表的交集)

在这里插入图片描述

查询所有课程和选了该课程名称的同学
1.明确“所有课程”,所以课程在左边并且全程左连接,以确保课程的全部内容都在
2.用课程左连接查询中间选课表,得到所有课程及学生id的选课情况
3.用 所有课程和学生id选课情况 左连接查询 学生表,得到所有课程及学生id选课情况及学生姓名
4.明确最终结果要的是 学生姓名和课程名称
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值