MySQL-多表关系、多表查询

article/2025/7/2 5:55:29

一. 一对多(多对一)

        1. 例如;一个部门下有多个员工

                在数据库表中多的一方(员工表)、添加字段,来关联一的一方(部门表)的主键

二. 外键约束

        1.如将部门表的部门直接删除,然而员工表还存在其部门下的员工,出现了数据的不一致问题,是因为在数据库层面,员工表与部门表并未建立关联,所以无法保证数据的一致性和完整性。此时就需要外键约束

       可以在创建表时 或 表结构创建完成后,为字段添加外键约束:

        例如:

                ALTER TABLE EMP ADD CONSTRAINT FK_EMP_DEPT_id foreign key (dept_id) references dept(id);

-- 创建表时指定
create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key (外键字段名) references 主表 (字段名));-- 建表完成后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (字段名);

         物理外键

                使用foreign key 定义外键关联另外一张表(已经被逻辑外键取代

                缺点:① 影响增、删、改的效率(需要检查外键关系)

                        ② 仅用于单节点数据库,不适用与分布式、集群场景。

                        ③ 容易引发数据库的死锁问题,消耗性能

        逻辑外键:

                在业务层逻辑中,解决外键关联,通过逻辑外键,就可以很方便的解决上述问题-----推荐使用

三.一对一

        1. 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。

        2. 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

四.多对多

        1. 例如;学生与课程之间的关系,一个学生可以选择多门课程,一门课程也可以供多个学生选择

        2. 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

五. 多表查询

        从多张表中查询数据

        1. 笛卡尔积

                指在数学中,两个集合(A集合和B集合)的所有组合情况--

                select * from emp, dept;

                在多表查询时,需要消除无效的笛卡尔积。

                select * from emp, dept where emp.dept_id = dept.id;

        2. 连接查询

                内连接

                        相当于查询A、B两表交集的部分数据。

-- 1. 隐式内连接 (常用)
select 字段列表 from 表1, 表2 where 连接条件...;-- 2. 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件 ..;-- 给表起别名
select 字段列表 from 表1 [as] 别名1, 表2 [as] 别名2 where 条件...;
-- 例如
select emp.id, emp.name,dept.name from emp, dept where emp.dept_id = dept.id;
select emp.id, emp.name,dept.name from emp inner join  dept on emp.dept_id = dept.id;
select emp.id, emp.name,dept.name from emp  join  dept on emp.dept_id = dept.id;select e.id, e.name,d.name from emp e, dept d where e.dept_id = d.id and e.salary > 5000;
select e.id, e.name,d.name from emp e inner join  dept d on e.dept_id = d.id where e.salary > 5000;
                外连接
                        左外连接

                                查询左表所有数据(包括两张表交集部分的数据)

                        右外连接

                                查询右表所有数据(包括两张表交集部分的数据)

-- 左外连接 (常见)
select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;-- 右外连接
select 字段列表 from 表1 right [outer] join  表2 on 连接条件...;
-- 左外连接 包含左表所有数据
select e.name,d.name from emp e left join dept d on e.dept_id = d.id;
select e.name,d.name,e.salary from emp e left join dept d on e.dept_id = d.id where e.salary > 5000;-- 右外连接 包含右表表所有数据
select d.name,e.name from emp e right join dept d on d.id = e.dept_id

                         对于外连接,常用的是左外连接,因为右外连接的SQL也可以改造成左外连接(两张表换个顺序)

        3. 子查询

                (1) SQL语句中嵌套select语句,称为嵌套查询,又称子查询

                (2) 格式:select * from 表1 where 字段 = (select 字段 for 表2...)

-- 子查询
select * from emp where emp.entry_date = (select min(e.entry_date) from emp e) ;

                (3) 说明:子查询外部的语句可以是insert / update /delete /select 的任何一个,常见的是select

                (4) 分类:

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

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

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

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

-- 例如-- 标量子查询
select * from emp where emp.entry_date = (select min(e.entry_date) from emp e) ;
select * from emp where emp.entry_date > (select e.entry_date from emp e where e.name = '武松' ) ;-- 列子查询
select e.* from emp e where e.dept_id in (select d.id from dept d where d.name in ('人事部','就业部'));-- 行子查询
select * from emp where (salary, job) = (select salary, job from emp where emp.name = '武松');-- 表子查询
select e.* from emp e, (select dept_id, max(salary) maxSa from emp group by dept_id) e2where e.dept_id = e2.dept_id and e.salary = e2.maxSa;

http://www.hkcw.cn/article/FyauctVgdn.shtml

相关文章

Arbitrum Stylus 合约实战 :Rust 实现 ERC721

在上一篇中,我们学习了如何在 stylus 使用 rust 编写 ERC20合约,并且部署到了Arbitrum Sepolia ,今天我们继续学习,如何在 stylus 中使用 rust 实现 ERC721 合约,OK, 直接开干! 关于环境准备,请…

超声波测距三大算法实测对比

前言 声波测距的数据包含很大噪声,即使障碍物(以纸板为例)静止,测量距离数据也上下跳变,需要通过数据滤波算法降低测量误差,主要滤波算法有平均值滤波和卡尔曼滤波。 在超声波测距中,无滤波、…

【2025年5月】AI生产力再探再报:各家智能体持续内卷,前沿应用不断细分

前言 2025年5月的个人学习笔记。 一、工具尝鲜快报:初探感觉好玩,但还未深入的工具。 二、生产力军火库:开箱即用的神器,以及一些好用的技巧。 三、前沿动态速递:一些可反复品读的优质资料和个人感兴趣的新工具。 文章…

ubuntu22.04安装megaton

前置 sudo apt-get install git cmake ninja-build generate-ninja安装devkitPro https://blog.csdn.net/qq_39942341/article/details/148388639?spm1001.2014.3001.5502 安装cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 …

shell脚本的条件测试

命令结果判定 && :在命令执行后如果没有任何报错时会执行符号后面的动作 || :在命令执行后如果命令有报错会执行符号后的动作 条件判断 # test 语句 # [],[[]],(()) 语句 # [[]] 可以支持的表达式更多,是最常…

已有的前端项目打包到tauri运行(windows)

1.打包前端项目产生静态html、css、js 我们接下来用vue3 vite编写一个番茄钟案例来演示。 我们执行npm run build 命令产生的dist目录下的静态文件。 2.创建tarui项目 npm create tauri-applatest一路回车,直到出现。 3.启动运行 我们将打包产生的dist目录下的…

随记 nacos + openfegin 的远程调用找不到服务

这里的配置问题就不说了,基本的都没有问题,然后现在的是怎么样的场景呢,就是有两台服务器,两台服务器分别部署了两个模块,B要调用A服务,然后通过nacos找到了这个服务的名称,但是呢发现连不上&am…

【Python 算法零基础 4.排序 ⑦ 桶排序】

草木不争高,争的是生生不息 —— 25.5.26 选择排序回顾 ① 遍历数组:从索引 0 到 n-1(n 为数组长度)。 ② 每轮确定最小值:假设当前索引 i 为最小值索引 min_index。从 i1 到 n-1 遍历,若找到更小元素&am…

天机学堂-分页查询

需求 分页查询我的课表 返回: 总条数、总页数、当前页的课表信息的集合 返回的VO(已经封装成统一的LearningLessonsVO) 定义Controller RestController RequestMapping("/lessons") RequiredArgsConstructor public class Lear…

Transformer 是未来的技术吗?

之前的文章中,聊了不少关于 Transformer 方面的内容: Transformer 中的注意力机制很优秀吗?-CSDN博客初探 Transformer-CSDN博客来聊聊Q、K、V的计算-CSDN博客 现在的大模型基本都是基于 Transformer 或者它的演进技术,那么&…

阿里云国际站,如何通过代理商邀请的链接注册账号

阿里云国际站:如何通过代理商邀请链接注册,解锁“云端超能力”与专属福利? 渴望在全球化浪潮中抢占先机?想获得阿里云国际站的海量云资源、遍布全球的加速节点与前沿AI服务,同时又能享受专属折扣、VIP级增值服务支持或…

[创业之路-404]:企业战略管理案例分析-战略执行-人才战略

一、概述 在BLM(业务领先模型)战略执行中,人才是核心模块和关键要素,其管理需紧密围绕战略目标展开,具体如下: 1. 人才战略与战略目标的对齐 关键任务分解:通过战略解码,将业务目…

C++11 : 智能指针

C11 : 智能指针 目录 C11 : 智能指针引言1. 智能指针的使用场景分析2. RALL和智能指针的设计思路3. C标准库智能指针的使用4. 智能指针的原理5. shared_ptr和weak_ptr5.1 shared_ptr循环引用问题5.2 weak_ptr 6. shared_ptr的线程安全问题7. C11和boost中…

嵌入式开发之STM32学习笔记day16

STM32F103C8T6 I2C通信协议 1 I2C简介 I2C(Inter-Integrated Circuit)是一种两线制的串行通信协议,广泛应用于微控制器与外围设备之间的数据传输,它支持多主多从的通信模式,允许多个设备连接在同一总线上,…

Redis数据类型操作命令

Redis通用命令 keys:查看符合模板的所有key 因为keys命令使用的是模糊查序,比较耗性能,由于有redis是单线程,因此在生成情况下不建议使用该命令。del:删除一个或者多个keyexists:判断一个key是否存在expi…

Leetcode 2123. 使矩阵中的 1 互不相邻的最小操作数

1.题目基本信息 1.1.题目描述 给你一个 下标从 0 开始 的矩阵 grid。每次操作,你可以把 grid 中的 一个 1 变成 0 。 如果一个矩阵中,没有 1 与其它的 1 四连通(也就是说所有 1 在上下左右四个方向上不能与其他 1 相邻)&#x…

STL解析——list的使用

目录 1.简介 2.构造函数 3.迭代器 3.1封装 3.2迭代器分类 4.排序性能 4.1链式与数组 4.2缓存读取 1.简介 STL容器中提供的list容器也是一种顺序容器,底层实现方式是带头双向链表,这种实现方式能比单链表更高效的访问数据。 下面围绕部分重要接口…

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握)

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握) 前言一、什么是集合查询?二、集合操作的三种类型1. 并操作2. 交操作3. 差操作 三、使用集合查询的前提条件四、常见问题与注意事项五、…

数学建模期末速成 最短路径

关键词:Dijkstra算法 Floyd算法 例题 已知有6个村庄,各村的小学生人数如表所列,各村庄间的距离如图所示。现在计划建造一所医院和一所小学,问医院应建在哪个村庄才能使最远村庄的人到医院看病所走的路最短?又问小学建…

MonitorSDK_监测用户行为(点击、页面路由变化、页面浏览量变化)

点击事件监测 为了实现用户点击事件的监控和数据埋点,可以通过监听全局的 mousedown 和 touchstart 事件,收集用户交互数据,并将其上报到服务器。 export default function onClick(){[mousedown, touchstart].forEach( eventType > { …