-
2022-03-04 10:12:57
引言
在数据库中,单表的操作是最简单的,但是在实际业务中最少也有十几张表,并且表与表之间常常相互间联系;
一对多、一对一、多对多是表与表之间的常见的关系,初学时在多表连接时会纠结如何写对应的Sql语句,下面就分享一些小技巧;
一对多
一对多是最基础的表间关系,意思是一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录只能对应一张表A中的一条记录
举个一对多的例子:
有两张表,
表A:学生表student(子表)
id name class_id(外键非空:班级id) 1001 张三 111 1002 张四 222 1003 王五 111 1004 赵六 111
表B:班级表class(父表)
id name 111 class1 222 class2
一个班级对应多个学生,一个学生只能对应一个班级,所以这两个表的关系也就很明确了:
班级表中的一条记录可以对应学生表的多条数据,学生表中的一条记录只能对应班级表的一条数据;
查询案例:查询所有姓张的学生的id,name和所在班级name
SELECT s.id,s.name,c.name as className FROM student s JOIN class c ON s.class_id=c.id WHERE s.name LIKE '张%'
在一对多关系中需要注意以下几点:
- 添加数据时,先添加父表(class)记录,再添加子表(student)记录;(比如增加一个学生而他的班级是class3,父表没有该班级需要先添加)
- 删除数据时,先删除子表(student)记录,再删除父表(class)记录;(比如删除一个学生且只有他的班级是class2,先删除学生后再删除父表的class2)
在设计表时,可以遵循以下口诀:
一对多,两张表,多的表加外键
解释一下:在一对多的关系中,存在两张表(一张父表一张子表),父表的一条数据对应子表的多条数据,那么子表(多)就需要添加上父表(一)的外键字段;
这样才能将两张表连接起来;
一对一
一对一的关系就是一种特殊的多对多的关系,一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记录也只能对应一张表A中的一条记录
例如:
学生表student:
id name 1001 张三 1002 张四
学生卡表card:
id name 111 card1 222 card2
这里的一个学生只能对应一张学生卡,一张学生卡只能对应一个学生,那么学生和学生卡就是一对一的关系;
一对一设计有两种方案:
共享主键:(不推荐)
共享主键就是让学生表的主键和学生卡表的主键一样,那么两张表可以变成这样:
学生表student id name 1001 张三 1002 张四 学生卡表card id name 1001 card1 1002 card2
这样学生卡表的id和学生表的id主键相同,这就是主键共享
查询案例:查询张三的学生卡信息
SELECT * FROM card c WHERE id='1001'
注意:
- 添加数据:先添加先产生的表,后添加后产生的表记录
- 删除数据:先删除后产生的表记录,再删除先产生的表记录
- 查询数据:无需进行连接查询
但是一般在表的设计时尽量避免主键的相同,所以主键共享一般不会去使用,了解即可;
唯一外键:(外键加一个唯一性约束)
唯一外键是一对一设计推荐的方法,顾名思义,也是需要给某个表添加外键,但是该外键必须有唯一性约束,通俗来说就是该外键不能有重复;
假设给学生卡表添加外键:
学生表student id name 1001 张三 1002 张四 学生卡表card id name stuent_id(设计表时给该字段添加唯一性约束) 111 card1 1001 222 card2 1002
还是上面的例子:查询张三的学生卡信息
SELECT * FROM card c JOIN student s ON c.student_id=s.id WHERE s.name='张三'
在这里就直接当成一对多使用即可,所以一对一和一对多语法上并没有什么太大区别,只是在外键处加了一个唯一性约束;
多对多
多对多的意思是:一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录
比如:
学生表student:
id name 1001 张三 1002 张四 1003 王五 1004 赵六
课程表course:
id name 111 java 222 mysql
这两张表就是多对多的关系,因为一个学生可以选择多门课程,一门课程可以被多个学生选择;
那么这样不论给哪个表添加外键都不行,这时就需要额外创建一个关系表来存放这两张表的id键值:
学生课程关系表student_course_relation(关系表):
student_id course_id 1001 111 1001 222 1002 111 1002 222
这样就可以分开来看了:
学生表和关系表就是一对多的关系,课程表和关系表也是一对多的关系
查询案例:查询所有姓张的学生的id、name和所选课程的name
SELECT s.id, s.name, c.name FROM student s JOIN student_course_relation scr ON scr.student_id=s.id JOIN course c ON scr.course_id=c.id WHERE s.name LIKE '张%'
多对多关系同样注意几点:
- 添加数据时,先添加父表记录(student,course),再添加子表(student_course_relation)记录
- 删除数据时,先删除子表记录(student_course_relation),再删除父表记录(student,course)
在多对多设计表时,可以遵循以下口诀:
多对多,三张表,关系表加外键
意思就是当存在多对多的关系时,需要涉及到第三张表关系表的设计,而关系表就是存放了存在多对多关系的两张表的外键;
总结
在写sql语句中最重要的就是找表之间的关系,只有搞清楚各种表之间的联系,才不容易出错;
这两句口诀再强调一下:
一对多,两张表,多的表加外键
多对多,三张表,关系表加外键
更多相关内容 -
关系型数据库的一对一、一对多、多对一、多对多关系
2020-12-21 17:23:09一对一: 一个主键只能对应一个外键 一对多: 一个主键可以对应多个外键 多对一: 多个主键可以对应一个外键 多对多: 一个主键可以对应多个外键 并且 多个主键可以对应一个外键关联映射:一对多/多对一
存在最普遍的映射关系,简单来讲就如球员与球队的关系;
一对多:从球队角度来说一个球队拥有多个球员 即为一对多
多对一:从球员角度来说多个球员属于一个球队 即为多对一数据表间一对多关系如下图:
关联映射:一对一
一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。
数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。一对一外键关联,图示如下:
一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系。图示如下:
关联映射:多对多
多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。
数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。
数据表间多对多关系如下图:
-
数据库一对一、一对多、多对多关系
2018-01-10 15:54:10数据库一对一、一对多、多对多...1、一对一关系实例 * 一个人对应一张身份证,一张身份证对应一个人 2、一对多关系实例 * 一个班级拥有多个学生,一个学生只能够属于某个班级 3、多对多实例 * 一个学生可以数据库一对一、一对多、多对多关系
本来数据库一对一、一对多、多对多关系并不复杂,但是最近在理解的时候感觉又感觉多了写新意,所以现在在来总结一下吧一、首先给出三种关系的实例1、一对一关系实例* 一个人对应一张身份证,一张身份证对应一个人2、一对多关系实例* 一个班级拥有多个学生,一个学生只能够属于某个班级3、多对多实例* 一个学生可以选修多门课程,一个课程可以被多个学生选修
二、一对一关系
一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面
三、一对多关系
- 班级是1端,学生是多端,结合面向对象的思想,1端是父亲,多端是儿子,所以多端具有1端的属性,也就是说多端里面应该放置1端的主键,那么学生表里面应该放置班级表里面的主键
四、多对多关系
对于多对多关系,需要转换成1对多关系,那么就需要一张中间表来转换,这张中间表里面需要存放学生表里面的主键和课程表里面的主键,此时学生与中间表示1对多关系,课程与中间表是1对多关系,学生与课程是多对多关系
四、总结
总而言之,最重要的关系就是1对多关系,根据面向对象思想在建表的时候将1端主键置于多端即可。
-
关系型数据库中一对多,多对一,多对多关系(详细)
2018-06-30 17:24:28在关系型数据库中,通过...一对多关系一个班级有很多学生,外键维护在学生的一方,也就是多的一方。(在做页面设计的时候,需要把两个表连接到一块查询信息)建立一个student和clazz表clazz id name1 一班2 二班3 ...在关系型数据库中,通过外键将表跟表之间联系在了一起。
一对多关系
一个班级有很多学生,外键维护在学生的一方,也就是多的一方。(在做页面设计的时候,需要把两个表连接到一块查询信息)
建立一个student和clazz表
clazz
id name
1 一班
2 二班
3 三班
student
id name clazz_id
1 小明 2
2 小红 3
3 小张 1
select s.name,c.name from student as s,clazz as cwhere c.id=s.clazz_id;
一对一关系。一对一是一对多的特例,外键唯一。在上面的student和clazz表中,假设一个班级只能有一名学生,clazz_id(外键)不能重复。
多对多关系。
外键维护在桥表中,不在两个多的任意一方。下面举一个例子更好地说明。
student
id name
1 小明
2 小红
3 小张
课程表 course
id name
101 java
102 php
103 c
学生选课表 sc
id course_id student_id grade
1 101 1 60
2 102 1 80
3 103 2 80
查询id=1的学生的选的课程,名字,分数。
select s.*,c.name,sc.grade from student as s,clazz as c,sc
where sc.course_id=c.id
and sc.student_id=s.id
and s.id=1;
-
举例说明什么是组合关系什么是聚合关系
2021-01-12 03:05:00展开全部组合关系是指一个单位和同一e5a48de588b662616964757a686964616f31333431363030序列的其他单位间的关系,或共现的所有成分的关系处于组合关系的词必须满足一些句法和语义条件。组合关系也称句段关系,可比作... -
数据表对应关系(一对一、一对多、多对多)
2018-04-27 14:54:54一对一Ø 一对一是将数据表“垂直切分”,其实是不常见,或不常用的。也就是 A 表的一条记录对应 B 表的一条记录,为什么要这样的设计呢,不是增加了程度的复杂性吗,然而并不一定,举例说明: 1) 一个系统... -
数据库实体之间的关联关系:一对一、一对多、多对多
2017-10-23 23:30:05数据库实体间有三种关联关系:一对一,一对多,多对多。一对一实例:一个学生只有个身份证编号。 一对多实例:一个班级有多个学生。 多对多实例:多对多就是双向一对多,一个学生可以选择多门课,一门课也有多名学生... -
操作系统-进程和程序之间的关系(一对一,一对多,多对一,多对多)
2020-02-02 11:23:03进程和程序之间可以形成一对一,一对多,多对一,多对多的关系,分别举例说明在什么情况下会形成这样的关系? 进程的定义 从不同的角度进程可以有不同的定义,比较典型的定义有: (1)进程是程序的一次执行过程。 ... -
数据库中ER图(一对多、一对一、多对多)讲解
2022-04-16 18:22:21实体所具有的一个属性 用椭圆型表示,并用无向边将其与相应的实体连接起来 关系 实体和实体之间以及实体内部的关系 用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来, ... -
关系型数据库和非关系型数据库举例
2018-09-05 21:34:421.关系型数据库通过外键关联来建立表与表之间的关系, 2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定 比如 有一个学生的数据: 姓名:张三,性别:男... -
【离散数学】等价关系与等价类,相容关系和偏序关系举例
2020-04-10 10:57:20等价关系举例 相容关系举例 偏序关系举例 等价类的定义 等价关系与等价类的例题 商集的定义 集合中的三种关系 等价关系:设R为定义在集合A上的关系,若R是自反的,对称的,传递的,则R称为等价关系 相容关系... -
关系模式规范化举例理解:第一范式、第二范式、第三范式
2021-03-27 16:40:29在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系型数据库。 例如,这样是符合的:student(id,name,age,class) 而这样就不符合:student(id,... -
Spring Data JPA 之 一对一,一对多,多对多 关系映射
2018-06-10 17:01:10  一、@OneToOne关系映射 JPA使用@OneToOne来标注一对一... 这里用两种方式描述JPA的一对一关系。 一种是通过外键的方式(一个实体通过外键关联到另一个实体的主键); 另外一种... -
【集合论】序关系 ( 偏序关系 | 偏序集 | 偏序集示例 )
2020-10-12 11:17:02一、偏序关系 、 二、偏序集 、 三、偏序集示例 ( 大于等于、小于等于、整除 | 有序对元素是单个数值 ) 、 四、偏序集示例 2 ( 包含关系 | 有序对元素是集合 ) 、 五、偏序集示例 3 ( 加细关系 | 有序对元素是集族 ) -
数据库的关系表:一对多、多对多实例
2016-12-06 13:38:09一个项目对应多个学生 一个学生对应多个项目(多对多关系) ...实现多对多关系,必须要第三表来操作,且它们都属于外键。...一个项目对应一个老师(一对多关系) 导师表 项目表 -
网上购物系统-关系型数据库设计举例
2020-05-25 00:38:58网上购物系统前台的用户共分两类:一类是注册用户(正式用户),这类用户有基本的信息,可以对自己的信息进行查看与修改,可以随时实现网上购物。当用户在网站所购商品总金额达一定数量,可以根据所购商品总金额数量... -
组合关系和聚合关系.
2020-12-19 12:16:301组合关系和聚合关系浙江广播电视大学章一鸣(2004年10月14日)一、组合关系和和聚合关系的提出组合关系和聚合关系是现代语言学中的一个基本原理。《语言学纲要》上说:“符号和符号组合起来的关系称为符号的组合关系... -
Java——三大特性之一:多态(概念理解+应用举例)
2020-06-27 10:43:45多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 1.1 多态的优点 ①消除类型之间的耦合关系。 ②可替换性。 ③可扩充性。 ④接口性。 ⑤灵活性。 ⑥简化性。 1.2 多态存在的三个必要条件 ①继承。... -
如果一个关系模式设计得不好,对数据库会造成哪些方 面的后果
2018-10-18 00:05:06sql 性能降低 关联关系变得复杂 sql操作工作量增加 数据库数据冗余 -
【集合论】等价关系 ( 等价关系概念 | 等价关系示例 | 等价关系与闭包 )
2020-10-08 23:29:20一、等价关系 、 二、等价关系示例 、 三、等价关系与闭包示例 、 -
【JPA】 @OneToOne 一对一单向关联注解
2017-09-15 11:10:32生活中的一对一关系,举例:人(man) 和 宠物(pet)。前提(一人只养一个宠物) 为什么这个一对一关系是单向的?如果,人养了宠物,那么我们通过“人”就能得到他所拥有的“宠物”的实体。但是,是不是通过... -
UML类图符号 各种关系说明以及举例
2016-08-11 15:00:34UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。 依赖(Depe -
解决json序列化有多对一和多对多关系的对象时造成死循环的问题
2017-01-04 09:39:26json序列化的对象中存在...使用@JsonBackReference标记在有多对一或者多对多关系的属性上即可解决这个问题,举例: @JsonBackReference @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "market_id") privat -
【集合论】二元关系 ( 二元关系记法 | A 到 B 的二元关系 | 二元关系个数 | 二元关系示例 )
2020-10-02 13:09:58一、 二元关系 、 二、 二元关系记法 、 三、 A 到 B 的二元关系 、 四、 A 到 B 的二元关系个数 、 五、 A 到 B 的二元关系举例 -
数据库设计的第一范式(1NF),第二范式(2NF),第三范式(3NF) [举例说明]
2021-01-21 17:11:17目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 注:本文只讲前三个范式 先看一下下面这样的表(可以对照... -
MySQL SELECT COUNT 一对多关联查询去重
2019-09-01 10:40:31如一对多 关系时,统计一 的一方数量,这时使用 SELECT COUNT 就容易出现统计数目不准,有重复的现象。 2 问题复现 举例: 有一用户表(user) 和一张 用户图像表(user_photo),用户表与用户图像表属于一... -
Java——三大特性之一:继承(概念理解+应用举例)
2020-05-26 11:32:46继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 ... -
关系运算符
2020-03-18 18:43:44程序设计是对实际问题解决过程的模拟,常常需要做判断,像“如果这样,我就执行动作A,如果那样,我就执行动作B”,那怎么判断这样那样呢,就需要关系运算符和关系表达式。 关系运算符表达式示例代码: 运行... -
数据库 关系模式和关系的区别
2020-03-07 13:54:17定义 ...一个关系对应一张二维表,二维表就是关系名。 关系模式(Relation Schema) 在二维表中的行定义,即对关系的描述称为关系模式。 一般表示为(属性1,属性2,…,属性n) 例如:老师的关... -
第一范式、第二范式及第三范式的定义与举例
2013-11-20 20:59:08存在非主属性对码的部分依赖关系 R(A,B,C) AB是码 C是非主属性 B-->C B决定C C部分依赖于B 第一范式 定义:如果关系R 中所有属性的值域都是单纯域,那么关系模式R是第一范式的 那么符合第一模式的特点就有 1)有...