MySQL连表操作之一对多

MySQL连表操作之一对多

目录

  • 引入
  • 外键
    • Navicat创建外键
    • 使用外键
    • SQL命令创建外键
    • 代码删除外键
    • 代码增加外键
    • 通过外键进行数据操作

正文

回到顶部

引入

当我们在数据库中创建表的时候,有可能某些列中值内容量很大,而且重复。

例子:创建一个学生表,按学校年纪班级分,表的内容大致如下:

idnamepartment
1xxxx学校x年级x班级
2ooox学校x年级x班级
3zzzz学校x年级x班级
4dddy学校x年级x班级

我们看出来对应的partment对应的值很长,而且重复量很大,这样就很不合适。

因此我们考虑将复杂重复的部分单独拿出来分成2个表:

第一张表:

idcaption
1x学校x年级x班级
2y学校x年级x班级
3z学校x年级x班级

第二张表在之前的基础上修改的:

idnamepartment
1xxx1
2ooo2
3zzz3
4ddd1

这样看起来就很简洁了,我们将很长的且重复的部分拿出来,然后规定编号,创建学生表的时候,学生对应的partment只需要取学校对应的id便可,这样同时这2张表也就会关联起来。

说明:

1、他们的关联关系;表2中的partment和表1的id联系再一起。

2、表一的数据会对应表2中的多条数据,这就叫一对多

问题:此时,两张表是相对独立的,都可以各自插入自己的数据,这样做很合适的,并没实质行的关联?

因此,必须要将其限制。表二的partment数据必须是表一中有的,不然,就不让其增加。

这里(partment)就引入了一个名词 —- 外键

回到顶部

外键

说明:
1、外键:一个表接收另一个表的主键。
2、partment外键的是表一中的nid。
3、当我们创建了外键,则系统变默认会为我们添加,相应的约束,如:表二中的partment数据必须是表一中nid有的;表二和表一就关联起来了。

Navicat创建外键

创建part表:

1481267881120

创建person表:

1481267949167

外键的创建注意点:
创建外键时,互相对应的表中的数据类型必须一样

创建外键

1、首先在要创建外键的表上右键,选设计表。
2、进入设计表,在右边显示表行信息,然后点击外键:

1481268565436

3、选择字段,会出现一个选择框,选择你要设置外键的列;

1481268675355

4、选择参考表,选择要外键要关联的表,

1481268768575

说明:
参数数据库:因为两个数据库在同意目录下,所以这里可以不用选择;默认是同目录下的。

5、选择参考字段;选择参考表中要设为外键的列;

1481268901706

注意:
外键的创建,连个表中关联的列的数据类型必须一样,不然不能成功。

6、保存CTRL + S

使用外键

此时part中没有数据,如果此时你在person中添加数据,结果:

1481269064394

在part中添加数据,结果:

1481269148396

此时再在,person中添加数据:

1481269219718

注意:

这里不能输入part中nid没有的值,不然也会报错。

1481269304129

SQL命令创建外键

创建part:

create table part(
	nid int not null auto_increment primary key,
	caption varchar(32) not null
)

 part

创建person:

create table person(
  nid int not null auto_increment,
  name varchar(32) default null,
  email varchar(32) default null,
  part_nid int,
  primary key(nid),
  constraint fk_person_part foreign key (part_nid) references part(nid)
)

 person

创建完之后外键对应代码的关系:

image

分析:
1、从名字可以看出代码对应的是什么位置的。
2、图中名(C对应代码中的CONSTRAINT)这行可以不用设,系统会默认帮我设置,但是最好设置,如果要删除外键的时候,就可以通过这个名字进行相应的操作

代码删除外键

01

alter table person1drop foreign key fk_person1_part1;

代码增加外键

01

alter table person1add constraint fk_p1_t1foreign key (part1_nid)references part1(nid);

通过外键进行数据操作

part表:

1481274072447

person表:

1481274100625

需求:要找出person表中属于x学校的人?

1、之前学的办法:

  • 1、先去part中获取x对应的nid
  • 2、然后再通过这个nid与parson中part_id对用的关系,查找出对应的name

01

select name from personwhere part_idin (select nid form partwhere caption ="x")

2、链表方法 left join

left join

使用连表提供的方法,left join操作代码:

01

select *from personleft join parton person.part_id = part.nid

结果显示:

1481274965703

分析:
left join:相当于将part表匹配的部分直接移动到person的列后面,组合起来显示。

既然内容都合并了,那么此时我们再加上判断,就可以将要的数据获取了。

代码1:

01

select *from personleft join parton person.part_id = part.nidwhere part.caption ="x"

结果:

1481275260873

说明:

之前我们用的 * 获取的是全部的信息,如果我们获取指定的信息,可以将其修改。

如:只获取person的name代码:

01

select person.name from personleft join parton person.part_id = part.nidwhere part.caption ="x"

结果:

1481275364629

注意:
join连接的条件,使用 on 进行对接的,条件写在on后面。

01

Aleft join Bon a.xx = b.xx

left join的特点:
1、以A为主
2、将A中的所有数据罗列
3、B则只显示与A相对应的数据

问题:验证我们说的谁在前就谁为主,谁的数据就全部显示,我们将person和part换个位置?

01

select *from partleft join personon person.part_id = part.nid;

结果:

1481292040108

right join

在谁显示所有数据的上来看,他和left join刚好相反,以后面的表为主,显示其所有的数据。

inner join

会将没有建立关系的数据忽略掉。不管谁在前,结果都是一样。

01

select *from personinner join parton person.part_id = part.nid;

结果:

1481292750984

总结:
1、这几个join可以写多个的,意思就是一个表可以同时有多个外键。

2、当选择的列名,是所有表中唯一的话,可以不用写前缀的表名。如:person.part_id就可以直接写成part_id.

3、上面的part表,有个别名叫,字典表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/342012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot Vue二手闲置物品交易系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

C语言之反汇编查看函数栈帧的创建与销毁

文章目录 一、 什么是函数栈帧?二、 理解函数栈帧能解决什么问题呢?三、 函数栈帧的创建和销毁解析3.1、什么是栈?3.2、认识相关寄存器和汇编指令3.2.1 相关寄存器3.2.2 相关汇编命令 3.3、 解析函数栈帧的创建和销毁3.3.1 预备知识3.3.2 代码…

Python 猎户星空Orion-14B,截止到目前为止,各评测指标均名列前茅,综合指标最强;Orion-14B表现强大,LLMs大模型

1.简介 Orion-14B-Base是一个具有140亿参数的多语种大模型,该模型在一个包含2.5万亿token的多样化数据集上进行了训练,涵盖了中文、英语、日语、韩语等多种语言。在多语言环境下的一系列任务中展现出卓越的性能。在主流的公开基准评测中,Orio…

Qt —— 自定义飞机仪表控件(附源码)

示例效果 部署环境 本人亲测版本Vs2017+Qt5.12.4,其他版本应该也可使用。 源码1 qfi_ADI::qfi_ADI( QWidget *parent ) :QGraphicsView ( parent ),m_scene ( nullptr )

英语连读技巧12

1. this thing – 这件事 连读听起来就像是:【the sing】 连读的音标为: 例句:i cannot get this thing off my mind. 发音指导:注意 “this” 和 “thing” 两个词在连读时,“s” 和 “th” 的音接近融合&#xf…

浏览器提示“此网站的安全证书有问题”

有时候在浏览一些网站的时候,点进去的时候不是直接显示内容,而是弹出来一个警告的界面,告诉你此网站的安全证书有问题,浏览器是建议你不要再继续访问了,当然你也可以选择继续访问。那么,你还敢继续访问一个…

2.1.2 关系模式

1. 什么是关系模式 2. 定义关系模式 3. 关系模式与关系 1.什么是关系模式 关系模式是型,关系是值 。 关系模式是对关系的描述: 描述关系元组集合的结构 , 属性构成 l,属性来自的域 l&#…

品牌营销:长期价值与潜在利益的共赢之路

在当今品牌营销面临着前所未有的挑战。品牌信息的传递不仅需要迅速,更要持久。而在这个过程中,产品的长期价值和潜在利益成为品牌营销的核心。本文迅腾文化将通过奥卡姆剃刀定律和霍夫曼编码的视角,探讨品牌营销如何实现长期价值和潜在利益的…

gitlab.rb主要配置

根据是否docker安装,进入挂载目录或安装目录 修改此文件,我一般是在可视化窗口中修改,有时候也在命令行手敲 将下面的配置复制到该文件中 external_url http://192.168.100.50 # nginx[listen_port] = 8000 (docker安装的这一行不需要,因为端口映射导致此处修改会导致访问…

助力公益事业,吉林长春市第二社会福利院与清雷科技达成合作

“通过部署清雷科技智慧康养大屏和毫米波雷达监测设备,可以实时查看全院入住人员的生命体征情况,包括呼吸、心率、在离床状态、睡眠报告等,对呼吸异常、跌倒风险异常的人员还会特别标注提醒,提高护理员工作效率的同时,…

SCT9430TVBR:3.8V-36V输入,3A同步降压DCDC转换器

• 通过开关节点无振铃降低 EMI • 400KHz固定开关频率,6% 抖频拓展频谱 • 轻载条件下的脉冲跳跃模式 PSM • 3.8V-36V 宽输入电压范围 • 最大连续3A输出负载 • 0.8V 1% 反馈参考电压 • 集成80mΩ (Rdson) 上端MOSFET 和 42mΩ (Rdson) 下端MOSFET • 1uA 关断电…

【机组】指令控制模块实验的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺一、 实验目…

Redis——RDB持久化

前言 Redis是一个键值对数据库服务器,服务器中通常包含任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 因为Redis数据库是内存数据库&a…

如何在Docker上运行Redis

环境: 1.windows系统下的Docker deckstop 1.Pull Redis镜像 2.运行Redis镜像 此时,Redis已经启动,我们登录IDEA查看下是否连接上了 显示连接成功,证明已经连接上Docker上的Redis了

INTEWORK—PET 汽车软件持续集成平台

产品概述 INTEWORK-PET-CI是经纬恒润自主研发的汽车软件持续集成&持续交付平台,在传统的持续集成基础上深化了研运一体化(DevOps)的概念,将嵌入式软件中的拉取代码、检查、构建、测试、版本管理以及发布交付等环节串联起来&am…

大模型学习与实践笔记(十一)

一、使用OpenCompass 对模型进行测评 1.环境安装: git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时,可以在原命令基础上加上地址: https://mirror.ghproxy.com git clon…

〔保姆级教学〕2024华数杯国际赛B题完整参考论文22页+四小问matlab代码+数据集+可视化高清图表

光伏发电 一、问题分析(完整资料在文末) 问题一: 首先题目要求得到电能行业与经济状况、居民消费水平、城市化率和市场化程度等因素的关系,并对供电量进行预测。其中,电能采用供电量数据、经济采用GDP数据&#xff…

JavaEE 网络原理

JavaEE 网络原理 文章目录 JavaEE 网络原理1. 网络互连1.1 局域网LAN1.2 广域网WAN 2. 网络通信基础2.1 IP地址2.2 端口号 3. 网络协议3.1 概念3.2 五元组3.3 协议分层3.4 TCP/IP 五层模型3.5 封装和分用 1. 网络互连 随着时代的发展,需要多个计算机协同工作来完成…

一款自动化提权工具

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。…

Unity3D控制人物移动的多种方法

系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…