MySQL-多表关系、多表查询

一. 一对多(多对一)

        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.pswp.cn/news/908331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解 一、前言:移动开发声明式 UI 框架的技术变革 在移动操作系统的发展历程中,UI 开发模式经历了从命令式到声明式的重大变革。 根据华为开发者联盟 2024 年数据报告显示,HarmonyOS 设备…

【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理

这篇学习笔记是Spring系列笔记的第7篇,该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记,供自己和他人参考。 Spring学习笔记目录 笔记1:【SSM】Spring基础: IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…

借助 Spring AI 和 LM Studio 为业务系统引入本地 AI 能力

Spring AI 1.0.0-SNAPSHOTLM Studio 0.3.16qwen3-4b 参考 Unable to use spring ai with LMStudio using spring-ai openai module Issue #2441 spring-projects/spring-ai GitHub LM Studio 下载安装 LM Studio下载 qwen3-4b 模型。对于 qwen3 系列模型,测试…

C++学习-入门到精通【13】标准库的容器和迭代器

C学习-入门到精通【13】标准库的容器和迭代器 目录 C学习-入门到精通【13】标准库的容器和迭代器一、标准模板库简介1.容器简介2.STL容器总览3.近容器4.STL容器的通用函数5.首类容器的通用typedef6.对容器元素的要求 二、迭代器简介1.使用istream_iterator输入,使用…

Vue Router的核心实现原理深度解析

1. Vue Router的基本架构 Vue Router的核心功能是实现前端路由,即在不重新加载页面的情况下更改应用的视图。它的基本架构包括: 路由配置:定义路径与组件的映射关系路由实例:管理路由状态和提供导航方法路由视图:渲染…

设计模式——状态设计模式(行为型)

摘要 状态设计模式是一种行为型设计模式,核心在于允许对象在内部状态改变时改变行为。它通过状态对象封装不同行为,使状态切换灵活清晰。该模式包含环境类、抽象状态类和具体状态类等角色,具有避免大量分支判断、符合单一职责和开闭原则等特…

C++ 观察者模式:设计与实现详解

一、引言 在现代软件开发中,组件间的交互与通信是系统设计的核心挑战之一。观察者模式(Observer Pattern)作为一种行为设计模式,提供了一种优雅的解决方案,用于实现对象间的一对多依赖关系。本文将深入探讨 C++ 中观察者模式的设计理念、实现方式及其应用场景。 二、观察…

Windows 账号管理与安全指南

Windows 账号管理与安全指南 概述 Windows 账号管理是系统安全的基础,了解如何正确创建、管理和保护用户账户对于系统管理员和安全专业人员至关重要。本文详细介绍 Windows 系统中的账户管理命令、隐藏账户创建方法以及安全防护措施。 基础账户管理命令 net use…

[蓝桥杯]摆动序列

摆动序列 题目描述 如果一个序列的奇数项都比前一项大&#xff0c;偶数项都比前一项小&#xff0c;则称为一个摆动序列。即 a2i<a2i−1,a2i1 >a2ia2i​<a2i−1​,a2i1​ >a2i​。 小明想知道&#xff0c;长度为 mm&#xff0c;每个数都是 1 到 nn 之间的正整数的…

Python 网络编程 -- WebSocket编程

作者主要是为了用python构建实时网络通信程序。 概念性的东西越简单越好理解,因此,下面我从晚上摘抄的概念 我的理解。 什么是网络通信? 更确切地说&#xff0c;网络通信是两台计算机上的两个进程之间的通信。比如&#xff0c;浏览器进程和新浪服务器上的某个Web服务进程在通…

GM DC Monitor如何实现TCP端口状态监控-操作分享

本节讲解如何通过现有指标提取监控脚本制作自定义的TCP端口监控指标 一、功能介绍 通过提取已有的监控指标的监控命令&#xff0c;来自定义TCP端口的监控指标。 二、配置端口监控 1&#xff09;定位监控脚本 确定脚本及参数如下&#xff1a; check_protocol_tcp.pl --plug…

LabVIEW与Modbus/TCP温湿度监控系统

基于LabVIEW 开发平台与 Modbus/TCP 通信协议&#xff0c;设计一套适用于实验室环境的温湿度数据采集监控系统。通过上位机与高精度温湿度采集设备的远程通信&#xff0c;实现多设备温湿度数据的实时采集、存储、分析及报警功能&#xff0c;解决传统人工采集效率低、环境适应性…

Ntfs!ReadIndexBuffer函数分析之nt!CcGetVirtualAddress函数之nt!CcGetVacbMiss

第一部分&#xff1a; NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…

vite+vue3项目中,单个组件中使用 @use报错

报错信息&#xff1a; [plugin:vite:css] [sass] use rules must be written before any other rules.use 官方说明 注意事项&#xff1a; https://sass-lang.com/documentation/at-rules/use/ 样式表中的 use 规则必须位于所有其他规则&#xff08;除 forward 外&#xff0…

基于VMD-LSTM融合方法的F10.7指数预报

F10.7 Daily Forecast Using LSTM Combined With VMD Method ​​F10.7​​ solar radiation flux is a well-known parameter that is closely linked to ​​solar activity​​, serving as a key index for measuring the level of solar activity. In this study, the ​​…

React 新项目

使用git bash 创建一个新项目 建议一开始就创建TS项目 原因在Webpack中改配置麻烦 编译方法:ts compiler 另一种 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react项目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夹中…

2025年- H65-Lc173--347.前k个高频元素(小根堆,堆顶元素是当前堆元素里面最小的)--Java版

1.题目描述 2.思路 &#xff08;1&#xff09;这里定义了一个小根堆&#xff08;最小堆&#xff09;&#xff0c;根据元素的频率从小到大排序。小根堆原理&#xff1a;堆顶是最小值&#xff0c;每次插入或删除操作会保持堆的有序结构&#xff08;常用二叉堆实现&#xff09;。 …

VR/AR 显示瓶颈将破!铁电液晶技术迎来关键突破

在 VR/AR 设备逐渐走进大众生活的今天&#xff0c;显示效果却始终是制约其发展的一大痛点。纱窗效应、画面拖影、眩晕感…… 传统液晶技术的瓶颈让用户体验大打折扣。不过&#xff0c;随着铁电液晶技术的重大突破&#xff0c;这一局面有望得到彻底改变。 一、传统液晶技术瓶颈…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的时候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够&#xff0c;因此去官网https://ghostscript.c…

【TinyWebServer】线程同步封装

目录 POSIX信号量 int sem_init(sem_t* sem,int pshared,unsingned int value); int sem_destroy(sem_t* sem); int sem_wait(sem_t* sem); int sem_post(sem_t* sem); 互斥量 条件变量 为了对多线程程序实现同步问题&#xff0c;可以用信号量POSIX信号量、互斥量、条件变…