数据库MySQL多表设计、查询

news2024/11/27 16:52:47

目录

1.概述

2.一对多

3.一对一

4.多对多

5.多表查询

5.1内连接

5.2外连接

5.3子查询


1.概述

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多、多对多、一对一。

数据库的多表设计是关系型数据库设计中的一种常见方法,它通过将数据分散存储在多个表中来实现数据的组织和管理。多表设计的主要目的是实现数据的规范化,以减少数据冗余,提高数据的一致性和完整性。设计时需要仔细规划和考虑,以确保数据库既灵活又高效。设计过程中可能需要多次迭代,以适应不断变化的业务需求。

数据库中的多表查询是常见的操作,它允许从多个表中检索数据,并将这些数据以某种方式组合起来。在编写多表查询时,重要的是要理解每个表的结构,以及表之间的关系。通常通过外键来实现。使用合适的连接类型可以有效地检索和组合数据。

2.一对多

例如部门和员工,一个部门有多个员工,而每一个员工对应一个部门。在设计表时,多的一方(员工表)叫子表,一的一方(部门表)叫父表。实现方式为:在多的一方(员工表)添加一个字段(归属部门),关联一的一方(部门表)的主键即可。

外键:

当把id为1的学工部删除后,员工表中依然有员工归属于学工部,此时数据就出现不完整和不一致的问题了。因此我们需要外键约束来解决多表之间的一致性和完整性问题。

通常使用图形化界面去添加外键,外键添加后,将无法删除和员工表有关的部门数据。

通过foreign key关键字定义的外键称为物理外键,在大型项目中禁止使用,它有以下缺点:

  1. 性能问题:每次插入或更新涉及外键的表时,数据库都需要检查外键约束,这会增加额外的查询和锁操作,尤其是在高并发场景下会导致性能瓶颈

  2. 并发问题:使用外键时,数据库需要在修改数据时获取额外的锁,导致在高并发大流量事务场景中增加死锁的风险

  3. 扩展性问题:物理外键会限制数据库的扩展性。在进行表结构重构、迁移或分表分库操作时,物理外键会增加复杂性和困难,因此仅用于单节点数据库,不适用集群和分布式

为了避免以上问题,我们选择逻辑外键(在业务逻辑中,解决外键关联),它指的是在应用程序层面上实现的外键关系,而不是在数据库层面上通过数据库的外键约束(物理外键)来实现。逻辑外键通过应用程序代码来维护数据的一致性和完整性,而不是依赖数据库的内置约束机制。

3.一对一

例如用户和身份证就是一对一的关系。这种关系通常用来做单表拆分,将一张大表拆分成两个小表,以提升操作效率。

一对一可以看成特殊的一对多,它也可以通过外键来实现,只需要在任意一方添加外键去关联另一方的主键,同时加上unique约束保证值唯一即可。

4.多对多

例如学生和课程,一个学生可以选修多个课程,每个课程也有多个学生选修。可以通过建立第三张中间表来实现,第三张表中有两个外键,分别关联两方主键。

5.多表查询

在进行多表查询时,会将每个表的每条记录都和另外的表进行组合。比如a表有5条数据,b表有6条数据,那么多表查询时会查询出30条数据。这种现象称为笛卡尔积。

笛卡尔积:a集合和b集合的所有组合情况。如果a集合有X个元素,b集合有Y个元素,那么它们的笛卡尔积将有X×Y个元素。在实际应用中,笛卡尔积通常不是我们想要的结果,因为它会产生大量的组合,其中许多是无效或不相关的,因此我们要消除多余的笛卡尔积。

多表查询中根据查询的形式分为连接查询子查询,连接查询又分为内连接外连接,外连接又分为左外连接和右外连接。

内连接查询AB交集。左外连接查询A,右外连接查询B。子查询就是嵌套查询。

5.1内连接

隐式显式没区别,仅是表达方式不同

5.2外连接

5.3子查询

子查询的分类:

  • 标量子查询:子查询返回的结果为单个值。
  • 列子查询:子查询返回的结果为一列。
  • 行子查询:子查询返回的结果为一行。
  • 表子查询:子查询返回的结果为多行多列

/*(select id from dept where name = '教学部')返回单个值,所以是标量子查询*/
/*查询教学部的员工*/
select * from emp where dept_id =(select id from dept where name = '教学部');

/*括号内的子查询返回一列两行,所以是列子查询*/
/*查询教学部和咨询部的员工*/
select * from emp where dept_id in 
(select id from dept where name = '教学部' or name = '咨询部'); 

/*其余类别子查询类似*/

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

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

相关文章

信息集成系统:打造智慧化的数字化平台

在现代社会中,信息集成系统已经成为不可或缺的一部分。它们不仅可以帮助企业管理各种数据和资源,还可以提供更高效的工作流程和更好的用户体验。本文将介绍信息集成系统的定义、优势、应用以及最新的技术趋势。 什么是信息集成系统?它是一种集…

2024年【甘肃省安全员C证】考试题及甘肃省安全员C证考试总结

题库来源:安全生产模拟考试一点通公众号小程序 甘肃省安全员C证考试题考前必练!安全生产模拟考试一点通每个月更新甘肃省安全员C证考试总结题目及答案!多做几遍,其实通过甘肃省安全员C证模拟试题很简单。 1、【多选题】《安全生产…

统信UOS系统访问windows共享目录

问题背景 当我们使用UOS系统的时候,想要访问windows系统的一些资料并将其拷贝下来使用的话,应该怎么操作呢?这个需求是可以实现的,统信UOS系统是基于Linux系统开发的,Linux系统和windows系统之间可以通过SMB协议来共享…

C++重要语法一图概括(复习用)

0.思维导图 1.传值返回和引用返回 1.1传值返回 传值返回所返回的是当前对象的拷⻉ 1.2引用返回 引⽤返回返回的是对象本身, 返回对象是⼀个局部变量,出了作⽤域便会 被销毁, 所以不可使⽤引⽤返回 出了作⽤域,引⽤对象还在,才可以引⽤返回 所以说如果⼀个变量⽣命周期只在…

嵌入式面试八股文(四)·同步和互斥、同步和异步、同步阻塞和同步非阻塞、异步阻塞和异步非阻塞的详细分析

目录 1. 同步和互斥 1.1 同步 1.2 互斥 1.3 总结 2. 同步和异步 2.1 同步 2.2 异步 3. 阻塞和非阻塞 3.1 阻塞 3.2 非阻塞 4. 同步阻塞和同步非阻塞 4.1 同步阻塞 4.2 同步非阻塞 4.3 同步阻塞和同步非阻塞的区别 5. 异步阻塞和异步非阻塞 5.1 …

基于微信小程序的学生宿舍管理系统设计与实现

宿舍管理 | 学生宿舍 | 学生宿舍管理 | 学生宿舍管理小程序 博主介绍:✌️大家好!我是Coder-coco,一名专注以理论为基础、实战为主的技术博主,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目&a…

使用html2canvas将网页导出为图片

1. 安装html2canvas npm install html2canvas或者 pnpm install html2canvas2. 简单使用案例 ref:Vue 3 的 ref 用来引用 DOM 元素。我们通过 exportContent 引用需要导出的 DOM 元素。 html2canvas:html2canvas 库会将指定的 DOM 元素渲染为画布&…

C++发送邮件:如何稳定实现邮件发送功能?

C发送邮件安全性探讨!C编程中发送邮件的技巧? 邮件发送功能是许多应用程序的重要组成部分,无论是用于通知用户,还是用于自动化报告。AokSend将探讨如何在C环境中稳定地实现邮件发送功能,确保邮件能够可靠地到达收件人…

深入解析:Redis与Nacos分布式锁在业务中的具体应用

时间:2024年08月22日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频地址:https://xima.tv/1_HBPYxC?_sonic0 希望大家帮个忙!如果大家有工作机会,希望帮小蒋内推一下&#x…

传输协议在文件传输中面临哪些挑战

文件传输是指通过网络或互联网连接将文件从一台计算机复制或移到另一台计算机的过程。这样即可在本地和远程的不同用户和/或计算机之间共享、传输或发送文件;文件传输通常受通信协议约束,通信协议是一组规则,用来规定如何在网络中的计算机之间…

在Chatbox(桌面ai工具)中使用SiliconCloud

在Chatbox中使用SiliconCloud 一,前言 "随着人工智能技术的发展,AI已经成为我们日常生活和工作中的重要组成部分。Chatbox是其中一种流行的桌面AI工具,它可以帮助用户进行AI对话和AI绘画。SiliconCloud则是一个AI平台,它提…

vue,div实现拖动,并给新位置

鼠标方上去随意拖动到其它位置 <template><div style"margin: 50px;"><div class"dade draggable-div" mousedown"startDrag($event)" mouseup"stopDrag" mousemove"drag($event)"style"width: 200px…

【JavaEE初阶】TCP协议

&#x1f332;TCP协议的概念 TCP&#xff08;TransmissionControlProtocol 传输控制协议&#xff09;是一种面向连接的、可靠的、面向字节流&#xff0c;双全工的传输层通信协议。 这几个特点在我们前面写得TCP服务器和客户端的搭建中&#xff0c;代码能够直观的感受到&#…

13 跳转控制语句(break、continue、goto),循环的加强练习

目录 1 break 1.1 介绍 1.2 流程图 1.3 在循环中使用 break 1.4 注意事项 1.5 案例&#xff1a;判断质数 2 continue 2.1 介绍 2.2 流程图 2.3 在循环中使用 continue 2.4 案例&#xff1a;逢七过游戏 3 goto 语句 3.1 介绍 3.2 基本语法 3.3 流程图 3.4 基本使…

开学必备清单来啦!大学好物合集推荐!每一个都能帮你提升幸福感

随着开学季的到来&#xff0c;好多学生都在忙着准备各类学习与生活必需品&#xff0c;以迎接新的大学生活到来。以下是一些开学季必备的好物推荐&#xff0c;每一个都很实用&#xff0c;可以帮你提升学习和生活的幸福感&#xff01; 1、西圣电容笔 一句话推荐&#xff1a;公认…

Windows 11 24H2 终于允许多个应用程序同时使用摄像头

Windows 11&#xff08;以及任何旧版本的 Windows&#xff09;均不允许多个摄像头应用程序访问网络摄像头硬件&#xff0c;除非使用第三方应用程序创建虚拟摄像头设置。这种情况将在未来发布的 Windows 11 版本 24H2 中得到改变&#xff0c;该版本将增加一项可选功能&#xff0…

nginx 添加第三方nginx_upstream_check_module 模块实现健康状态检测

安装插件 下载 链接&#xff1a;https://pan.baidu.com/s/1iTPEmu_hCHYhDyaVDDTsVg?pwdvaw8 提取码&#xff1a;vaw8 安装依赖 yum install pcre pcre-devel yum -y install make gcc-c gcc编译安装 $ nginx -V #此处省略了很多模块&#xff0c;只是为了看清而已 ... co…

轻松掌握LLM三角原则:简化大模型应用开发流程的理解指南

不少朋友偷偷问我&#xff1a;“什么是LLM的三角原则&#xff1f;”今天就给大家仔细讲讲构建LLM应用的三角原则。这套原则其实不复杂&#xff0c;由“31”(一范式三原则)个基础组成&#xff0c;适合任何团队来实践。 说到以LLM为核心的应用&#xff0c;有不少人以为是高大上的…

【考研数学】二战能不看课,直接刷1000题或者李林880吗?

二战数学&#xff0c;刷题的时间肯定要大于看课的时间&#xff0c;同时听课要注意&#xff1a; 1、针对问题听课&#xff0c;听课的时候你要带有目的性&#xff0c;如果毫无目的&#xff0c;那么这节课你能获得的东西就十分优先&#xff0c;你的精力也不会集中&#xff08;提高…

JS SyntaxError: Unexpected token 报错解决

JS SyntaxError: Unexpected token 报错解决 在JavaScript开发中&#xff0c;SyntaxError: Unexpected token 是一个常见的错误&#xff0c;它通常表示JavaScript引擎在解析代码时遇到了意料之外的符号。这个错误可能由多种原因引起&#xff0c;包括拼写错误、缺少括号、引号不…