MySQL 篇-深入了解多表设计、多表查询

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
 

文章目录

        1.0 多表设计概述

        1.1 多表设计 - 一对多

        1.2 多表设计 - 一对一

        1.3 多表设计 - 多对多

        2.0 多表查询概述

        2.1 多表查询 - 内连接

        2.2 多表查询 - 外连接

        2.3 多表查询 - 子查询


        1.0 多表设计概述

        多表设计是指在数据库中将数据分散存储在多个表中的设计方法。这种设计方法通常用于将数据按照不同的实体或属性进行划分,以便更好地组织和管理数据。

        在多表设计中,不同的表之间通常会通过外键来建立关联关系,从而实现数据之间的引用和关联。这种设计方法有助于减少数据冗余、提高数据的一致性和完整性,并且可以更好地支持数据的查询和分析。

        总的来说,为了数据在表中更好的管理,将数据拆分到不同的表中。而表与表之间通过外键来建立联系。

        多表设计的类型主要分为:一对多、一对一、多对多。

        1.1 多表设计 - 一对多

        在数据库设计中,一对多关系指的是一个实体在另一个实体中有多个关联记录的关系。通常使用外键来实现一对多关系。假设我们有两个实体 A 和 B ,A 实体可以有多个关联的 B 实体记录,而B实体只能关联一个 A 实体记录。

外键语法:

-- 创建表时指定
create table 表名(
        字段名 数据结构,
        ...
        [constraint] [外键名] foreign key(外键字段名) references 主表(字段名)
    );


-- 建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(字段名);

        举个例子,部门与员工的关系,一个部门可以有多个员工,而一个员工只能属于一个部门,这就构成了一对多的关系,为了建立部门与员工的关系,则在员工表中添加外键即可。

代码如下:

create table department(
    id tinyint unsigned primary key comment '序号',
    name varchar(10) not null  comment '部门名称',
    last_time datetime not null comment '最后的操作时间'
)comment '部门表';

create table employee(
    id tinyint unsigned primary key comment 'id号',
    name varchar(10) not null  comment '名字',
    department_id tinyint unsigned comment '部门号',
    last_time datetime not null comment '最后的操作时间'
)comment '员工表';

-- 添加外键约束
alter table employee add  foreign key (department_id) references department(id);

-- 添加部门表中的数据
insert into department values (1,'学工部',now()),(2,'教研部',now()),(3,'教学部',now()),(4,'后勤部',now());
-- 添加员工表中的数据
insert into employee values (1,'张三',1,now()),(2,'李四',2,now()),(3,'王五',2,now()),(4,'赵六',4,now());

部门表:

员工表:

        这两个表已经建立了物理联系,通过外键来建立物理上的联系是为了保证数据的一致性和完整性。

        比如,现在要删除部门表中的 '教研部' 数据,代码如下:


delete from department where id = 2;

执行结果如下:

        由于添加了外键联系,为了确保数据的一致性和完整性,所以影响该操作失败。

而对与删除员工表中的数据则可以删除成功,代码如下:

delete from employee where name = '王五';

执行结果如下:

        物理外键:

        使用 foreign key 定义外键关联另外一张表。但是会影响增、删、改的效率(因为需要检查外键关系)、仅用于单节点数据库,不适用与分布式、集群场景、容易引发数据库的死锁问题、消耗性能。所以我们一般建立表与表之间的逻辑外键联系,而不建立物理外键联系。

        关于在一对多关系中在哪一个表中添加外键:

        简单粗暴的说,在一对多中,代表多的表需要添加外键,一个员工表与一个部门表,显然员工表是代表多的一方,部门表代表少的一方。因为一个部门有很多员工,而一个员工只能属于一个部门。

        1.2 多表设计 - 一对一

        在数据库中,一对一关系是指两个实体之间存在一种一对一的关联关系。这种关系通常通过在两个表之间共享一个相同的主键来实现。

        在任意一方加入外键,关联另外一个的主键,并且设置外键为唯一的 unique 。

        举个例子,用户与身份证信息的关系,一对一关系,用于单表的拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。

代码如下:

create table user(
    id tinyint unsigned primary key comment 'id号',
    name varchar(10) not null comment '名字',
    phone varchar(11) comment '电话号码',
    degree varchar(10) comment '学历',
    birthday date comment '出生日期'
)comment '用户表';

create table user_id_card(
    id_card varchar(18) primary key comment '身份证号码',
    issued varchar(10) not null,
    fk_id tinyint unsigned,
    constraint fk foreign key (fk_id) references user(id)
)comment '用户id表';

-- 添加数据
insert into user values (1,'鹰王','18812340001','初中','1960-11-06');
insert into user values (2,'辐王','18812340002','高中','1961-11-06'),(3,'龙王','18812340003','高中','1962-11-06');

insert into user_id_card values (100000000010000011,'朝阳',1),(100000000010000022,'西阳',2),(100000000010000033,'东阳',3);

             用户ID表:

用户表:

        通过物理外键已经建立好了两个表的联系了。

        关于在一对一关系中在哪一个表中添加外键:

        在一对一中,任意一个表中都可以添加外键,任选一个表即可。

        1.3 多表设计 - 多对多

        在多表设计中,多对多关系通常需要使用一个中间表来实现。这种中间表包含两个外键,分别指向参与关系的两个表。这样就可以实现多对多关系的表示。

        举个例子,学生与课程的关系,一个学生可以选修多门课程,一门课程也可以供多个学生选择。

代码如下:

create table student(
    id tinyint primary key comment 'id号',
    name varchar(10) not null comment '名字',
    no varchar(20) comment '学号'
)comment '学生表';

create table course(
    id tinyint primary key comment 'id号',
    name varchar(10) not null unique comment '课程名'
)comment '课程表';

create table course_student(
    id tinyint primary key comment 'id号',
    student_id tinyint comment '外键id号',
    course_id tinyint comment '外键id号',
    constraint fk_s foreign key (student_id) references student(id),
    constraint fk_c foreign key (course_id) references course(id)
)comment '学生与课程的中间表';

-- 添加数据
insert into student values (1,'张三',2002350101),(2,'李四',2002350102),(3,'王五',2002350103);
insert into course values (1,'Java'),(2,'PHP'),(3,'MySQL');
insert into course_student values (1,1,1),(2,1,2),(3,1,3),(4,2,1),(5,2,3),(6,3,2);

                                课程表:

                                中间表:

                                学生表:

        小结:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。

        2.0 多表查询概述

        多表查询是指在数据库中同时查询多个表的数据的操作。通过多表查询,可以根据不同表之间的关联关系,将数据连接起来。

        多表查询的方式:内连接、外连接、子查询。

        2.1 多表查询 - 内连接

        内连接是一种多表查询的方式,用于检索两个或多个表中满足连接条件的数据。内连接只返回满足连接条件的行,即两个表中的数据必须在连接条件下匹配才会被检索出来。

内连接语法:

-- 隐式内连接
select 字段列表 from 表1,表2 where 条件 ...;


-- 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 链接条件 ...;

        显示内连接更推荐使用,因为它提供了更清晰的语法结构和更好的可读性。隐式内连接虽然在一些情况可以简化语句,但是容易造成混淆和错误,不易维护。但是两者的效果是一样的。

        2.2 多表查询 - 外连接

        在数据库中,多表查询可以通过外连接来实现。外连接是一种连接操作,用于检索两个或多个表中的数据,即使其中一个表中的数据在另一个表中没有匹配项也可以检索出来。在外连接中,常见的类型有左外连接、右外连接。左外连接会返回左表中的所有数据,即使右表中没有匹配项;右外连接会返回右表中的所有数据,即使左表中没有匹配项。

外连接语法:

-- 左外链接
select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;

-- 右外链接
select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ...;

        左外链接与右外链接可以相互转换的,一般习惯用左外链接方式来查询多表。

        2.3 多表查询 - 子查询

        在数据库中,多表查询是指从多个表中检索数据的操作。而子查询是指在一个查询中嵌套另一个查询的操作。所以子查询也称为嵌套查询。

可以具体分为:

        标量子查询:子查询返回的结果为单个值。

        列子查询:子查询返回的结果为一列。

        行子查询:子查询返回的结果为一行。

        表子查询:子查询返回的结果为多行多列。

        返回的多行多列就是一个表,常作为临时表,常用的操作符:in 。

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

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

相关文章

激光炸弹c++

题目 输入样例: 2 1 0 0 1 1 1 1输出样例: 1 思路 由题知本题要求某个区间内数的和,联想到二维前缀和。我们可以先使用二维前缀和模板计算各区间的价值。然后枚举以某点为右下角,大小为R*R的正方形价值,取最大值。 …

C# LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址:https://github.com/advimman/lama 🦙 LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

双体系Java学习之关键字,标识符以及命名规范

重新开始从Java基础开始学,保持每周两更的状态,刚开学事情有点多。 关键字 标识符 命名规范

不用下载的工具却能保存西瓜视频的原画视频,支持无水印!

近年来,西瓜视频可谓是炙手可热,得益于其强大的后盾——抖音,以及推出的"中视频计划"。这个计划慷慨地斥资20亿用于支持视频制作者,因此在西瓜视频平台上,我们目睹了大量优质的长视频如雨后春笋般涌现。 对于…

云计算 3月6号 (系统中发送邮件)

系统中发送邮件 linux 系统中自带了内部邮件系统,可以通过mail命令进行邮件发送及接受 # 安装mailx yum install -y mailx 1.1 发送邮件给系统用户 # 方式1 mail -s "邮件标题" 收件人 邮件内容 ctrl d 结束发送 ​ # 方式2 echo 内容 | mail -s "…

SQL中如何添加数据

SQL中如何添加数据 一、SQL中如何添加数据(方法汇总)二、SQL中如何添加数据(方法详细解说)1. 使用SQL脚本(推荐)1.1 在表中插入1.1.1 **第一种形式**1.1.2 **第二种形式**SQL INSERT INTO 语法示例SQL INSE…

linux实现远程文件夹共享-samba

目录 问题描述Samba如何挂载常用参数临时挂载实例一种长期挂载方法(已失败,仅供参考)查看挂载取消挂载umount失败 问题描述 我的代码需要访问存在于两个系统(win和linux)的文件夹,我不是文件夹的创建者&am…

【高效开发工具系列】vimdiff简介与使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vant组件中van-overlay页面太长无法滚动

内容太长&#xff0c;发现电脑中滚轮可以滚动&#xff0c;但是手机端手指滑动动不了。 在组件上加lock-scroll <van-overlay :lock-scroll"false"> 默认为true 注&#xff1a;我使用的版本是4.8.5&#xff0c;据说2版本不生效。

TinyEMU编译与使用

TinyEMU编译与使用 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu&#xff0c;于2018-09-23&#xff0c;改为…

Windows安装Go语言及VScode配置

最近搞自己的网站时突然想起来很多上学时的事&#xff0c;那会美国总统还是奥巴马&#xff0c;网页课教的是DreamWeaver跟Photoshop&#xff0c;其他语言像PHP、Java8、Python都有学一点&#xff0c;讲究一个所见即所得。虽然是信管专业那时和斌桑班长对新语言很感兴趣&#xf…

企业级Avatar道具解决方案

美摄科技&#xff0c;作为业界领先的多媒体解决方案提供商&#xff0c;近日推出了一款革命性的Avatar道具解决方案&#xff0c;旨在帮助企业打造独特且高度个性化的数字形象&#xff0c;从而提升企业品牌的吸引力和影响力。 这款解决方案的核心在于其先进的单摄像头Avatar生成…

C++ 位运算OJ

目录 位运算常用操作&#xff1a; 1、 191. 位1的个数 2、 338. 比特位计数 3、 461. 汉明距离 4、136. 只出现一次的数字 5、 260. 只出现一次的数字 III 6、面试题 01.01. 判定字符是否唯一 7、 268. 丢失的数字 8、 371. 两整数之和 9、 137. 只出现一次的数字 II …

【C++实战项目】Date日期类 --- 运算符重载的深入探索

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 引言一、为什么需要运算符重载&#xff1f;二、日期类的实现1. 基本框架2. 预备工作3. Date 类…

海外媒体发稿:提升国外影响力的7种汽车媒体推广方法-华媒舍

伴随着全球化发展的推动&#xff0c;汽车市场已经变成世界各地关注的重点领域之一。提升汽车知名品牌在海外的影响力对于企业的发展趋势尤为重要。下面我们就详细介绍7种提升国外影响力的汽车媒体推广方法&#xff0c;协助汽车公司能够更好地进到国外市场。 1.公布知名品牌新闻…

Vue中有哪些优化性能的方法?

Vue是一款流行的JavaScript框架&#xff0c;用于构建交互性强的Web应用程序。在前端开发中&#xff0c;性能优化是一个至关重要的方面&#xff0c;尤其是当应用程序规模变大时。Vue提供了许多优化性能的方法&#xff0c;可以帮助开发人员提升应用程序的性能&#xff0c;从而提升…

【ESP32 IDF】I2C层次结构、I2C协议

文章目录 前言一、I2C的结构层次1.1 怎样在两个设备之间传输数据1.2 I2C如何传输数据1.3 硬件框图1.4 软件层次 二、IIC协议2.1 硬件连接2.2 I2C 总线的概念2.3 传输数据类比2.3 I2C信号2.4 I2C数据的含义 总结 前言 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一…

第 5 章 ROS常用组件静态坐标变换(自学二刷笔记)

5.1.2 静态坐标变换 所谓静态坐标变换&#xff0c;是指两个坐标系之间的相对位置是固定的。 需求描述: 现有一机器人模型&#xff0c;核心构成包含主体与雷达&#xff0c;各对应一坐标系&#xff0c;坐标系的原点分别位于主体与雷达的物理中心&#xff0c;已知雷达原点相对于…

【好书推荐-第九期】Sora核心技术相关书籍《扩散模型:从原理到实战》与《GPT 图解:大模型是怎样构建的》:Sora的两大核心技术,都藏在这两本书里!

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

《Vite 报错》ReferenceError: module is not defined in ES module scope

ReferenceError: module is not defined in ES module scope 解决方案 postcss.config.js 要改为 postcss.config.cjs&#xff0c;也就是 .cjs 后缀。 原因解析 下图提示&#xff0c;packages.json 中的属性 type 设置为 module。所有 *.js 文件现在都被解释为 ESM&#xff…