(一)背景介绍
  在数据库中建表时,很容易遇到一种情况:一个学生选修了多门课,而每门课有多名学生选修,“学生”和“课程”之间就是典型的多对多关系。
(二)如何建表
  遇到这种多对多关系,我们一般是创建三张表:Student(学生表)、Course(课程表)和选课表(id、student_id、course_id)

下面来自狗书

查询多对多关系要分成两步。

若想知道某位学生选择了哪些课程,

students中根据name获取id

registrations中根据id获取所有他选择的课程的id

classes中根据课程的id得到课程名字

#------------------------------------------------------------

同样,若想找到选择了某门课程的所有学生,

classes中根据课程的名字得到id

registrations中根据id获取所有选择这门课程的学生的id
students列表中根据所有选择这门课学生的id,获得所有学生的名字

#------------------------------------------------------------

光说不够,下面是具体的实践.

--------------------------------------------------------datagrip建表--------------------------------------------------------
学生表建立:
CREATE TABLE students
(
    id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(64),
    date time
);

中间表建立:
CREATE TABLE temp
(
    student_id int,
    curriculum_id int
);

课程表建立:
CREATE TABLE curriculums
(
    id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(32),
    date time,
    status varchar(8)
);

---------------------------------下面是插入数据-----------------------------------------------------------

students:

temp:

curriculums:

------------------------------下面是关联语句查询--------------------------------------------------------
小白兔选择的所有课程:
mysql>SELECT curriculums.name FROM curriculums 
INNER JOIN temp ON temp.curriculum_id=curriculums.id 
INNER JOIN students ON students.name="小白兔" and students.id = temp.student_id;
+-----------------+
| name            |
+-----------------+
| 数据库设计      |
| 计算机原理      |
| 大学物理        |
+-----------------+

选中"数据库设计"课程的所有人:
mysql>select students.name from students 
inner join temp on temp.student_id=students.id 
inner join curriculums on curriculums.name="数据库设计" and curriculums.id=temp.curriculum_id;

+-----------+
| name      |
+-----------+
| 小白兔    |
| 大森林    |
+-----------+

对于多对多关系的对象,如何建表与关联查询(转载)相关推荐

  1. 【从零开始学习Oracle数据库】(1)建表与简单查询

    一.常用数据库软件 大型数据库 Oracle Oracle是著名的Oracle(甲骨文)公司的数据库产品 , 它是世界上第一个商品化的关系型数据库管理系统 , 也是第一个推出和数据库结合的第四代语言开 ...

  2. SQL数据库实战(含建表数据和查询案例)

    Oracle数据库安装的时候会自带一个练习用数据库(其中包含employee表,后来版本中此表改名为emp): 首先在安装过程中应该有个选项"是否安装实例表"(完全安装模式下默认是 ...

  3. mysql 多对多建表_mysql – 为什么在多对多关系中创建一个新表?

    我正在创建一个数据库来存储有关乐器的信息.我在MySQL工作台中使用EER图来可视化每个表之间的关系. 当我创建多对多(n:m)关系时,会创建一个新表,其中包含新关系中涉及的表的主键.其他关系,如一对 ...

  4. 【SQL Server数据库】建库、建表、简单查询语句(一)

    记录数据库原理实验所用到的代码. 创建数据库 创建名称为XSGL_CP的数据库. create database XSGL_CP --设置主文件的逻辑名称.文件名.初始大小.最大文件大小限制.需要增加 ...

  5. 数据库关联映射建表图示(一对多、多对多)

    数据库关联映射建表图示(一对多.多对多) ~总结一下数据库的 一对多.多对一.一对一.多对多 关系 以及对应的建表方式~ 关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系: ...

  6. Flask 数据库高级多对多关系

    之前介绍了多对多关系:http://blog.csdn.net/ying847782627/article/details/51333090 在之前介绍的多对多关系中,关联表就是一个简单的表,不是模型 ...

  7. Flask 数据库多对多关系

    数据库使用关系建立记录之间的联系.其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起.实现这种关系时,要在"多"这一侧加入一个外键,指向"一&qu ...

  8. 数据库建表-- 一对多/多对一/一对一/多对多 关系

     转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...

  9. Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)

    文章目录 1.查询函数 2.F对象 3.Q对象 4.聚合函数 5.Count函数 6.查询集 查询集的特性 对查询集进行切片 判断一个查询集中是否有数据 7.模型类之间的关系 一对多关系 多对多关系 ...

最新文章

  1. mysql数据库支持的锁粒度包括_1. Mysql的并发(锁策略、锁粒度、事务)
  2. Nutch爬虫引擎使用分析
  3. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— Arduino相关设置
  4. Taro+react开发(94):问答模块01
  5. Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例
  6. 一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...
  7. /etc/fstab文件出错,无法进入Linux系统
  8. nova 宿主机重启自动恢复虚拟机运行状态
  9. matlab 数学 应用论文,MATLAB在高等数学课程中的应用(图文)
  10. sockscap on linux: wsocks
  11. 混淆的艺术-(苍井空变凤姐)Proguard源码分析(二)Proguard参数解析
  12. 怎样用自己电脑搭建网络服务器!不花一分钱
  13. Photoshop_如何使用
  14. C++ 获取个位数十位数等
  15. 在自建机房给网站做ICP备案
  16. 定时开关机实现原理-Android4.4/6.0
  17. 玄学曲线——GPU呈现模式分析
  18. 2013年6月英语四级真题听力短文原文及重点词汇整理
  19. Dunn检验的介绍和python实现
  20. Qt 相机拍照 QCamera

热门文章

  1. Android为TV端助力 转载:android自定义view实战(温度控制表)!
  2. Radare - 逆向工程框架
  3. 初识Entity Framework CodeFirst(2)
  4. 32位微处理器的虚拟技术,是“坑爹”么!
  5. 看《疯狂的程序员》,很好很新奇
  6. 自动利用webshell执行系统命令py脚本
  7. js 替换任意字符串中间几位为*星号
  8. 九个console命令调试JS
  9. lcl手术和飞秒区别_干货科普:目前市面上4种近视手术方式有何区别(全飞秒、半飞秒、全激光、晶体植入)...
  10. 一个全屏页面切换实例