@概述

  • 关系型数据库中的表与表不是彼此独立,而是相互关联的;
  • 表与表之间的级联关系使得整个数据库成为一个有机关联的系统;
  • 表关系可以分为一对一、一对多、多对多三种,它们的维护方式各不相同;
  • 表关系的管理是关系型数据库的重要组成部分,要牢牢掌握;

@一对一

  • 如果A表记录与B表记录有双向的一 一对应关系,我们就称它们之间有一对一的关系;
  • 如校园数据库中的班级与班主任,班级有唯一的班主任,班主任执鞭唯一的班级,它们之间的关系就是一对一关系;
  • 一对一关系的维护,由A、B中相对次要的一方来维护(这里假设是B),维护的方式是在B中插入一个指向A表主键的外键;
  • 在本例中,班级表有一个masterid字段,指向老师表中的主键id;
  • 在一对一关系中,本来外键放在任意一方都是可行的,之所以要选择相对次要的一方,是因为万一不得以必须删除一个表时,我们会选择删除相对次要的表,此时由他所维护的关联关系也被一并删除,不会形成脏数据;

案例:查询某班级的班主任,查询某班主任管理的班级

-- 将老师robin设置为班主任
update teacher set is_master=1 where name='robin';-- 将班级“丐帮”的masterid设置为robin的id
-- 此时一对一关系已经形成,通过查询班级表中的masterid可以知道该班的班主任
-- 通过在班级表中查询特定老师的masterid,可以找到他执掌的班级
update clazz set masterid=(select id from teacher where teacher.name='robin') where name='丐帮';
-- 查询“丐帮”的班主任
-- ②查询老师表中id为①结果的老师信息
select * from teacher where id = (-- ①获取丐帮的班主任idselect masterid from clazz where name='丐帮'
);
-- 查询robin所管理的班级
-- ②查找班级表中masterid指向robin的记录
select * from clazz where masterid = (-- ①获取robin的idselect id from teacher where name="robin"
);

@一对多

  • 如果A表中的一条数据对应B表中的多条数据,而B表中的每条数据都对应一条唯一的A表数据,就称A表和B表是一对多的关系;
  • 如校园数据库中的班级与学生,每个班级有多名学生,而每个学生只属于一个唯一特定的班级,所以班级表和学生表是一对多的关系;
  • 一对多关系的维护,由多方进行维护,维护方式是多方在表中添加指向一方的外键;
  • 本例中,学生表中有classid来指向学生所对应的班级;

案例:查询一个班级的所有学生

-- 修改学生表信息,为每个学生指定classid
update student set classid=(select id from clazz where clazz.name = '丐帮') where student.name='野间忠一郎';
update student set classid=(select id from clazz where clazz.name = '小刀会') where student.name='二郎神';
update student set classid=(select id from clazz where clazz.name = '斧头帮') where student.name='张三丰';
update student set classid=(select id from clazz where clazz.name = '天地会') where student.name='郭小四';
update student set classid=(select id from clazz where clazz.name = '丐帮') where student.name='隔壁老王';
update student set classid=(select id from clazz where clazz.name = '小刀会') where student.name='练过的六爷';
update student set classid=(select id from clazz where clazz.name = '斧头帮') where student.name='洪七公';
update student set classid=(select id from clazz where clazz.name = '天地会') where student.name='香香八婆';
update student set classid=(select id from clazz where clazz.name = '丐帮') where student.name='马英九';
update student set classid=(select id from clazz where clazz.name = '小刀会') where student.name='十三姨';
update student set classid=(select id from clazz where clazz.name = '斧头帮') where student.name='山本五十六';
update student set classid=(select id from clazz where clazz.name = '天地会') where student.name='包租婆';-- 通过查询学生表中所有classid指向“小刀会”的记录,来查询班级“小刀会”的所有学生
select * from student where classid = (select id from clazz where clazz.name='小刀会');

@多对多

  • 如果A表中的一条记录对应B表中的多条记录,B表中的一条记录也对应A表中的多条记录,就称A表和B表是多对多的关系;
  • 如校园数据库中的学生与课程,每个学生可以选修多门课程,每门课程也可以有多名学员,所以学生表与课程表是多对多的关系;
  • 多对多关系的维护,要通过建立中间表来维护,一个学生每加选一门课程,就将学生的id和课程的id同时存入一条记录中进行记录,中间表的主键是【学生id和课程id的联合主键】,即同一个学生不能对同一门课程选修两次;

案例:查询某学生所选的全部课程,查询选修某课程的全部学生

  • 首先创建【学生_课程中间表】
-- 创建【学生_课程】中间表
create table student_course(-- 学生idsid integer not null,--课程idcid integer not null,-- 主键是【学生id和课程id的联合主键】primary key (sid,cid)
);-- 如果没有设置主键,可以通过修改表字段的方式来添加【联合主键】
-- alter table student_course add constraint s_c primary key (sid,cid);
  • 插入一些选课信息
-- 野间忠一郎选修了Python
insert into student_course(sid, cid) values ((SELECT id from student where student.name='野间忠一郎'),(select id from course where course.name='Python')
);-- 野间忠一郎选修了Java
insert into student_course(sid, cid) values ((SELECT id from student where student.name='野间忠一郎'),(select id from course where course.name='Java')
);-- 野间忠一郎选修了HTML5
insert into student_course(sid, cid) values ((SELECT id from student where student.name='野间忠一郎'),(select id from course where course.name='HTML5')
);-- 香香八婆选修了Python
insert into student_course(sid, cid) values ((SELECT id from student where student.name='香香八婆'),(select id from course where course.name='Python')
);-- 香香八婆选修了HTML5
insert into student_course(sid, cid) values ((SELECT id from student where student.name='香香八婆'),(select id from course where course.name='HTML5')
);-- 二郎神选修了Python
insert into student_course(sid, cid) values ((SELECT id from student where student.name='二郎神'),(select id from course where course.name='Python')
);
  • 查询香香八婆的选课信息
-- ②查询这些课程id所对应的课程信息
select * from course where id in (-- ①查询中间表中sid指向香香八婆的所有记录,获取对应的课程idselect cid from student_course where sid=(select id from student where name='香香八婆')
);
  • 查询选修了Python的学员
-- ② 查找学生id所对应的学生信息
select * from student where id in (-- ①查询中间表中所有课程id指向Python的记录,获得对应的学生idselect sid from student_course where cid=(select id from course where name='Python')
);

15.8数据库(8):MySQL表关系管理相关推荐

  1. MySql DDL语言(数据库和数据表的管理)

    数据定义语言,负责数据库和数据表的管理 ⒈数据库的管理 1.创建数据库 1 create database if not exists DatabaseName; #if not exists可以省略 ...

  2. MySQL 数据库与数据表的管理

    MySQL 数据库管理 1.创建一个管理系统数据库 CZX,代码如下: create database if not exists CZX charset=utf8; 2. 选择当前数据库为 CZX, ...

  3. MySQL 表关系及多表操作(联合查询、连接查询、子查询)

    文章目录 表关系 一对一关系 一对多关系 多对多关系 总结 MySQL多表操作 联合查询 联合查询排序 连接查询 交叉连接 内连接 外连接 自然连接 using关键字 子查询 表关系 表关系:一个表代 ...

  4. 数据库自学-多表关系和多表查询

    目录 1.多表关系 1.1一对多 1.2多对多 2.多表查询概述 笛卡尔积概述​编辑 多表查询分类 3. 内连接 1.隐式内连接 2.显式内连接 4.外连接 1.左外连接 2.右外连接 5.自连接 1 ...

  5. MySQL数据库【MySQL常用图形管理工具】

    MySQL常用图形管理工具 1.概述 2.常用工具介绍 Navicat SQLyog MySQL Workbench DataGrip 其他工具 常用工具Navicat和SQLyog的安装和使用 Na ...

  6. MySQL表结构管理

    今天我们来介绍一下MySQL数据类型,任何数据库中数据表的每个字段都必须设定数据类型,合适的数据类型可以有效的节省存储空间,有效的提升数据的计算性能,那么常见的数据类型有哪些呢,一起来看看吧 类型分类 ...

  7. java mysql 表关系分析_数据库表的关系

    表与表之间一般存在三种关系,即一对一,一对多,多对多关系. 下面分别就三种关系讲解数据库相关设计的思路和思考过程: (1)一对一关系 例如,下面的一张表,保存了人的相关信息,有男有女,要求查处所有的夫 ...

  8. mysql 表 组织 管理_MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理...

    1.InnoDB的数据存储结构 InnoDB中数据是通过段.簇.页面构成的. (1)段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引.表.回滚段的基本元素.创建一个索引( ...

  9. 【数据库】MySQL表的增删改查

    CRUD 即增加(Create).查询(Retrieve).更新(Update).删除(Delete)四个单词的首字母缩写 一.新增(Create) insert into 表名 values(列的值 ...

最新文章

  1. html 点击空白关闭浮层,js中点击空白区域时文本框与隐藏层的显示与影藏问题...
  2. java object save,通过ObjectOutputStream发送文件,然后将其保存在Java中?
  3. MPLS TE基本配置-OSPF
  4. WebGL on iOS8 最终等到了这一天
  5. 14_Android中Service的使用,关于广播接收者的说明
  6. [翻译]Windows Vista的秘密#11: 删除不可删除的东西
  7. 物联网应用:蓝牙模块在智能门锁中的应用
  8. linux指令:时间与日期
  9. 【音效处理】Vibrato 简介
  10. ios开发 访问mysql_iOS开发实战-时光记账Demo 网络版
  11. 玩玩AJAX之使用ashx文件响应来自JQuery的JSON请求.
  12. WebService-服务端与客户端
  13. 游戏计算机中有缓冲内存吗,内存再大都不行!CPU缓存竟这么重要
  14. 计算机专业学习自然辩证法,深度学习 自然辩证法
  15. 免费代码签名证书真的存在吗
  16. 摔鸡蛋,摔手机问题。
  17. inprivate浏览是什么意思_IE8的InPrivate浏览功能
  18. 阿里云购买域名并备案
  19. Maven命令行 打包
  20. SATA接口的硬件基础知识

热门文章

  1. 戈壁日记——一个来了又来的地方
  2. 谷歌书签同步到gitee
  3. 天融信 服务器映射,天融信(NAT)地址转换端口映射配置
  4. 使用chrom访问本地项目需要输入http
  5. vex机器人 亚洲公开赛_喜报| HFI人工智能社勇夺VEX机器人亚洲公开赛最高荣誉“全能奖”等四奖项...
  6. iOS开发中plist文件的创建与简单读取
  7. video标签无法播放视频
  8. java线程堆栈nid.tid_java多线程死锁 Java问题定位之Java线程堆栈分析(2)
  9. 企业信息安全注意事项
  10. ServerAgent 报错解决