首页 > 数据库 >MySQL数据库表关系详解

MySQL数据库表关系详解

时间:2024-03-11 21:35:35浏览次数:31  
标签:关系 name 数据库 外键 学生 详解 student MySQL id

MySQL数据库表关系详解

(1)一对一

  • 一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面

image

  • 一对一的关系就是一种特殊的多对多的关系,一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记录也只能对应一张表A中的一条记录
  • 例如:

学生表student:
id name
1001 张三
1002 张四

学生卡表card:

id name
111 card1
222 card2

  • 这里的一个学生只能对应一张学生卡,一张学生卡只能对应一个学生,那么学生和学生卡就是一对一的关系

  • 一对一设计方案:唯一外键:(外键加一个唯一性约束)
    唯一外键是一对一设计推荐的方法,顾名思义,也是需要给某个表添加外键,但是该外键必须有唯一性约束,通俗来说就是该外键不能有重复

  • 假设给学生卡表添加外键:

学生表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='张三'
  • 在这里就直接当成多对多使用即可,所以一对一和多对多语法上并没有什么太大区别,只是在外键处加了一个唯一性约束

(2)一对多

  • 一对多是最基础的表间关系,意思是一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录只能对应一张表A中的一条记录

image

  • 班级是1端,学生是多端, 结合面向对象的思想,1端是父亲,多端是儿子,所以多端具有1端的属性,也就是说多端里面应该放置1端的主键,那么学生表里面应该放置班级表里面的主键

  • 举个一对多的例子:有两张表

表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)

在设计表时,可以遵循以下口诀: 一对多,两张表,多的表加外键

在一对多的关系中,存在两张表(一张父表一张子表),父表的一条数据对应子表的多条数据,那么子表(多)就需要添加上父表(一)的外键字段

(3)多对多

  • 多对多的意思是: 一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录

image

  • 对于多对多关系,需要转换成1对多关系,那么就需要一张中间表来转换,这张中间表里面需要存放学生表里面的主键和课程表里面的主键,此时学生与中间表示1对多关系,课程与中间表是1对多关系,学生与课程是多对多关系

学生表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
WHEREs.name LIKE '张%'
  • 注:父表和子表的确认关系是:谁先生成谁是父表。

  • 上述一对多例子中必须要先生成1端的表,才能有多端的表,因此父表为班级表。

  • 而多对多的例子中则是给两张表(学生和课程)建立关联关系,需要在关系表子表中添加新的记录关联两张父表,因此父表为先生成的学生和课程表。

  • 在多对多设计表时,可以遵循以下口诀:

  • 多对多,三张表,关系表加外键!!!

  • 意思就是当存在多对多的关系时,需要涉及到第三张表关系表的设计,而关系表就是存放了存在多对多关系的两张表的外键;

(4)总结

  • 在写sql语句中最重要的就是找表之间的关系,只有搞清楚各种表之间的联系,才不容易出错;
  • 这两句口诀再强调一下:
  • 一对多,两张表,多的表加外键
  • 多对多,三张表,关系表加外键

标签:关系,name,数据库,外键,学生,详解,student,MySQL,id
From: https://www.cnblogs.com/ssrheart/p/18067109

相关文章

  • typeorm mysql 存储base64
    在TypeORM中使用MySQL存储Base64数据时,可以将Base64字符串转换为二进制数据并存储在BLOB字段中。以下是一个简单的例子:首先,确保你的实体有一个适当的列类型,比如blob。import{Entity,PrimaryGeneratedColumn,Column}from'typeorm';@Entity()exportclassMyEntity{@Pr......
  • t05_Mysql_properties驱动配置
    mysql-properties#mysql5驱动com.mysql.jdbc.Driverspring.datasource.username=rootspring.datasource.password=rootspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&userUnicode=true&characterEncoding=utf-8spring.datasour......
  • k01_mysql
    视图---事务---游标---存储过程---触发器1、视图创建视图--创建一个名为:view_student_info的视图,将student的所有信息放在视图中CREATEVIEWview_student_infoASSELECT*FROMstudent--指定创建视图名中的字段名称(默认创建的视图字段与原表完全相同,但是也可以不同)CRE......
  • 在数据库中使用UUID+自增长ID混合方式,同时满足系统安全性和查询效率
    在数据库中使用UUID+自增长ID混合方式,可以达到较好的安全性和查询效率。具体的实现方式如下:在数据库表中创建两个字段,一个是UUID字段作为全局唯一主键,另一个是自增长的整型字段作为局部有序键。例如:sql:CREATETABLE`table_name`(`uuid`CHAR(36)NOTNULL,--UUID......
  • Tool | 详解用户体验地图
     在产品规划的时候,作为产品经理需要经历“发现问题→解决问题”的过程,在发现问题时,通过用户访谈、市场调研、竞品分析、数据分析发现自身产品的问题,从而根据问题来对症下药。而此时,“用户体验地图”便派上了用场。用户体验地图,通过固定的思考框架,更有效且科学地发现产品所存在......
  • mysql查询几天之前,或某个时间段之间的每天记录数量,不存在补全0
    直接看SQL(非常简单,通俗易懂)biz_requirement_order:业务表名create_time:业务表时间字段,依据这个字段统计数量num:数量返回值别名,可以随意改t表:查询所有符合条件的日期a表:业务表中根据日期分组,查询每天的记录数量最后使用左连接查询,将两个集合合并返回最终结果查询几天之前......
  • 一文学会JDBC实现java和mySQL的数据连接(尚硅谷学习课程代码+笔记+思路总结)
    JDBC是指数据库连接技术,用于java连接mySQL等数据库。本文详细介绍了尚硅谷课程中JDBC的学习内容和补充知识。概述java语言只提供规范接口,存在于java.sql.javax.sql包下,然后数据库软件根据java提供的规范实现具体的驱动代码(jar)jar包是java程序打成的一种压缩包格式,只要导入就......
  • MySQL如果数据存在则更新,不存在则插入
    如果数据存在则更新,不存在则插入,MySQL有duplicate、replaceinto、replace三种方式如何更新数据?insertignoreinto又是如何插入数据的呢?准备表和基础数据测试MySQL版本:8.0.35usetestdb;#droptabletb_student;CREATETABLE`tb_student`(`id`intNOTNULLAUTO_IN......
  • MySQL如何选择时间类型
    日常业务中经常需要记录时间,如订单生成时间、记录保存时间、更新时间等。如何选择MySQL表的时间字段类型呢?一句话,看业务,具体是看业务是否会跨时区。MySQL的日期类型可以用于记录日期的格式有:Datatype实例备注DATE'0000-00-00'日期(年月日)TIME'00:00:00'......
  • MySQL 进阶实战
    目录1.数据库设计与规范化1.1.实体关系模型(ER模型)简介1.2.数据库设计的范式化过程1.3.设计常见问题和解决方案2.高级SQL技巧2.1.聚合函数和分组查询2.2.子查询和联合查询2.3.视图的创建和使用2.4.存储过程和触发器的概念3.数据库连接与应用开发3.1.使用编程......