当前位置: 首页 > news >正文

表的设计与查询

目录

一、表的设计

1.第一范式(一对一)

定义:

示例:

2.第二范式(一对多)

定义:

要求:

示例:

3.第三范式(多对多)

定义:

要求:

示例:

二、表的查询

表的拷贝(新增)

聚合查询

1.聚合函数:

2.group by(分组)

3.having(条件句)

联合查询

1.笛卡尔积

2.内连接

3.外连接

左外连接:

右外连接:

全外连接(了解)

4.自连接

子查询

使用子查询——‘=’:

子查询——'in'

子查询——‘all’

子查询——‘any’

子查询——‘exists’(较为重要)

示例一:

示例二:

示例三:

合并查询

union:

union all:


一、表的设计

数据库设计的三大范式是数据库规范化过程中重要的概念,它们通过一系列规则来减少数据冗余、提高数据的一致性。咱们只要按照这个规则,按部就班的设计,就可以,不难。

1.第一范式(一对一)

定义:

所有列的值都是原子的,即每列不能包含多个值或重复的组。

要求

  1. 每个表格的每个字段值都是不可分割的原子值
  2. 每一行中的值都唯一

原子就是一个对象的一个属性,例如:

描述一个人,性别、年龄、电话等都是一个原子。

示例:

假设我们有一个包含学生信息的表格,其中包括学生的姓名、电话号码和地址。

如果一个学生有多个电话号码,第一范式要求我们将这些电话号码分开,每个电话号码放在单独的一列中,而不是一个列中包含多个电话号码。

2.第二范式(一对多)

定义

在满足第一范式的基础上,非主属性必须完全依赖于主键,消除部分依赖。

要求

  1. 必须先满足第一范式
  2. 非主键列必须完全依赖于主键列

示例

假设我们有一个课程登记的表格,其中包含学生ID、课程ID、课程名称和成绩。这里学生ID和课程ID是联合主键。课程名称仅依赖于课程ID而不是联合主键。

在第二范式中,两个表要有同一个相同主键(字段),示例中就是课程ID,这样才能把两个表建立联系。

3.第三范式(多对多)

定义

在满足第二范式的基础上,消除传递依赖,即非主属性不依赖于其他非主属性。

要求

  1. 必须先满足第二范式
  2. 非主键列不能依赖于其他非主键列

示例

假设我们有一个员工信息表格,其中包括员工ID、部门ID、部门名称和员工姓名。这里部门名称依赖于部门ID,而部门ID是主键。

二、表的查询

表的拷贝(新增)

在介绍查询之前,新增表的一个语法介绍一下。

如图这里是两个学生表的结构:

两个表的内容:

student1:

student2:

假设有这样一个场景:

我们要把student2表中的内容,新增添加到student2表中(gender这个字段不添加),那么可以这样做:

insert 后面不加values 而是用select替代。

最终的student1表:

如果想要避免增加重复的数据可以这样:

最终结果:

聚合查询

1.聚合函数:

听起来很高级,实际上就是对数据表中的每一行中特定的一个字段进行数学计算:

COUNT([DISTINCT] expr)

  说明:      返回查询到的数据的 数量 SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义

AVG([DISTINCT] expr)

  说明:      返回查询到的数据的 平均值,不是数字没有意义

MAX([DISTINCT] expr)

  说明:      返回查询到的数据的 最大值,不是数字没有意义

MIN([DISTINCT] expr)

说明:        返回查询到的数据的 最小值,不是数字没有意义

示例:

可见,聚合函数的操作对象是某一列的所有相同类型的数据的。

2.group by(分组)

select 语句指定的字段必须是group by中的,如果要显示其他字段,需要把其他的字段搭配聚合函数使用才可以。

示例:

以学生id进行分组,求每一个学生的平均成绩:

如果要排列平均成绩的降序,那么order by要写到最后,desc写到 order by 的后面:

3.having(条件句)

having和where功能是一样的,用来筛选条件,只是使用group by语句后不能使用where,要使用having才可以

示例,查找平均成绩大于60的同学(降序):

order by语句仍然是要写到最后的

联合查询

联合查询类型有好几种,不用特意去记忆,只需要在特定场景使用特定方式查询即可。

1.笛卡尔积

要理解联合查询,要先了解笛卡尔积。

对就是离散数学里面的那个。

听起来很高级,实际上很简单,就是对两个集合的排列组合。

如图,对下面两个表进行笛卡尔积(排列组合):

笛卡尔积后:

笛卡尔积后的集合数量(6)就是之前两个集合数量之积(2*3)。

下面的联合查询都必须先进行笛卡尔积

注意:

多表联合查询会产生大量数据,如果原始两个表的数据本身就很多,这对性能影响很大,有时候甚至会把服务器搞挂,因此,要慎重,在操作前,预估一个范围。

2.内连接

解释:显示字段相互匹配的行数据。

语法:

inner 可加可不加。

示例:

如图student表:

classes表:

若我们想查询每一个学生对应哪一个班级,就可以使用内连接来进行(因为两个表恰好可以靠class_id来进行联系

使用join来进行:

使用where:

3.外连接

外连接和内连接一样,两个表要有同一个含义的字段建立起连接。

外连接分为左外连接和右外连接。

左外连接:

如图商品表(goods)和单价表(price):

如果我们要显示一个表,每一行包含name和对应的价格,那么如图:

这就是一个左外连接表。

这里的左,意思就是以左边的name为基准,显示表中所有的name,如果另一个表中,没有对应的商品价格,就设置为默认值。

语法:

右外连接:

其实就是左外连接的反向版本,以右边的表作为基准,全部显示,左边的表如果没有与之匹配的显示默认值。

示例:

如图goods表和money表:

        

右外连接后的表:

语法格式:

全外连接(了解)

MySQL不支持全外连接,不过oracle支持。

全外连接其实就是左、右外连接的复合:

4.自连接

自连接就是自己和自己笛卡尔积。

自己和自己笛卡尔积有什么用?

来我们看下面这个示例

如图,对分数表进行自连接:

使用语句:

唉,我们发现出问题了,显示说出现重复的别名,那么该如何跟自己笛卡尔积呢?

   很简单,分别进行取别名即可:

select * from score as sc1,score as sc2;

这里就不展示笛卡尔积后的结果了,因为数据量太大。

我们先回过头来看一下子表的结构:

假如说我们有这样一个查询需求,查询课程五分数比课程三 成绩高的同学,你会怎么做?

事先说明:

在sql中条件查询比较的都是同一行的不同列的字段。不能行与行进行比较。

因此不能直接用条件句去判断,这是自连接就派上用场了!

子表中的一列只有一个score。

咱们笛卡尔积一下不就有两个score了吗?

这样不就可以比较了?

问题不就解决了吗?

如图先筛选出既有3课程又有5课程的同学:

然后对表进行简化:

在语句后面多加一个条件既,课程五分数要大于课程三分数:

这就是我们依靠自连接得到的答案了。

自连接的优势实际上就是,把行无法比较的问题,转化成列可以比较的问题。

5.联合查询的基本思路(及其重要
1、分析查询需要用到那些表
2、使用这些表进行笛卡尔积
3、指定连接条件
4、进一步指定其他条件/聚合操作
5、对最终的表进行简化

子查询

子查询并不推荐,因为代码看起来会比较复杂
子查询实际上就是用学过的语法进行套娃。

示例:

假如说咱们要查询许仙同班同学的名字:

正常的写法:

1、查看整个表

2、查找许仙的班级:

3、 查询同班同学:

使用子查询——‘=’:

一步到位,但是缺点也很明显,代码复杂不易理解,尤其是出现多层嵌套的话。

‘=’子查询中,子句只返回一个值,不能返回多个值


子查询——'in'(条件是一个范围的时候使用)

返回多个结果。

假如说我们要查询分数大于80的同学:

那么可以使用in,不能使用=:

如果是查询小于80分的同学,直接NOT IN 即可:


子查询——‘all’

查询条件必须满足all关键字后面的所有条件。

示例:

查询最高分:

子查询——‘any’

any和some功能是一样的,any或者some内只要有一个条件满足就成立。

如图,查询一个非Sales部门的员工,他的薪资高于Sales部门所有员工的薪水:

那么可以使用any子查询:

换成some是一样的:

子查询——‘exists’(较为重要)

示例一:

查询Sales部门的所有成员:

示例二:

查找一个部门,这个部门一个员工都没有:

示例三:

查看某个部门,这个部门的人数必须大于1.

查询结果:

合并查询

union:

如图两张不同的学生表:

student1:

student2:

如果要查询老六和老七该如何做呢?

因为是两张不同的表,所以不能使用or,这是合并查询就派上用场了:

注意:

1、or和union功能差不多,但是nuion适用范围更加广泛。


2、union 会默认去除相同数据,在原表的基础上,下面的张三只出现了一次:


3、union和union all要求两张表中所查询的字段类型、个数、顺序必须一致(列名不要求)

union all:

功能和union一样:

相关文章:

表的设计与查询

目录 一、表的设计 1.第一范式(一对一) 定义: 示例: 2.第二范式(一对多) 定义: 要求: 示例: 3.第三范式(多对多) 定义: 要求…...

【react】如何合理使用useEffect

useEffect 是 React Hooks API 的一部分,它允许你在函数组件中执行副作用操作,比如数据获取、订阅或者手动更改 DOM。合理使用 useEffect 可以帮助你管理组件的生命周期行为,同时避免不必要的渲染和性能问题。以下是一些关于如何合理使用 useEffect 的建议: 明确依赖项: 当…...

计算机专业英语Computer English

计算机专业英语 Computer English 高等学校计算机英语教材 Contents 目录 Part One Computer hardware and software 计算机硬件和软件----------盖金曙 生家峰 Unit 1 the History of Computers计算机的历史 Unit 2 Computer System计算机系统 Unit 3 Di…...

目前比较好用的LabVIEW架构及其选择

LabVIEW提供了多种架构供开发者选择,以满足不同类型项目的需求。选择合适的架构不仅可以提高开发效率,还能确保项目的稳定性和可维护性。本文将介绍几种常用的LabVIEW架构,并根据不同项目需求和个人习惯提供选择建议。 常用LabVIEW架构 1. …...

CSS之块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…...

探索GPT-4V在学术领域的应用——无需编程即可阅读和理解科学论文

1. 概述 论文地址:https://arxiv.org/pdf/2312.05468.pdf 随着人工智能潜力的不断扩大,人工智能(AI)在化学领域的应用也在迅速发展。特别是大规模语言模型的出现,极大地扩展了人工智能在化学研究中的作用。由于这些模…...

耐用充电宝有哪些?优质充电宝到底选哪个?良心推荐!

在电量即生产力的现今时代,如何为移动设备寻找一位最佳的伴侣呢?一款耐用、优质的充电宝无疑是你的不二之选。今天我们将带您揭开市场隐藏的一面,揭示哪些充电宝品牌真正代表了耐用与品质的标杆。让我们一起深入了解并选购最适合自己的充电宝…...

何为屎山代码?

在编程界,有一种代码被称为"屎山代码"。这并非指某种编程语言或方法,而是对那些庞大而复杂的项目的一种形象称呼。屎山代码,也被称为"祖传代码",是历史遗留问题,是前人留给我们的"宝藏"…...

基于esp8266_点灯blinker_智能家居

文章目录 一 实现思路1 项目简介2 项目构成3 代码实现4 外壳部分 二 效果展示UI图片 一 实现思路 摘要:esp8266,mixly,点灯blinker,物联网,智能家居,3donecut 1 项目简介 1 项目效果 通过手机blinker app…...

Web前端开发交流群:深度探索、实践与创新的集结地

Web前端开发交流群:深度探索、实践与创新的集结地 在数字时代的浪潮中,Web前端开发扮演着举足轻重的角色。为了促进前端技术的交流与发展,Web前端开发交流群应运而生,成为众多开发者学习、分享、创新的集结地。本文将从四个方面、…...

苹果AI一夜颠覆所有,Siri史诗级进化,内挂GPT-4o

苹果AI一夜颠覆所有,Siri史诗级进化,内挂GPT-4o 刚刚,苹果AI,正式交卷! 今天,苹果构建了一个全新AI帝国——个人化智能系统Apple Intelligence诞生,智能助手Siri迎来诞生13年以来的史诗级进化…...

量子计算的奥秘与魅力:开启未来科技的钥匙(详解)

目录 一、量子计算的基本概念 二、量子计算的基本原理 1.量子叠加态与相位态 一、概念 二、量子叠加态 定义与原理 特性与影响 应用领域 三、量子相位态 定义与原理 特性与影响 应用领域 2.量子门操作 一、概念 二、量子门操作的基本概念 三、常见的量子门操作…...

redis 主从同步时,是同步主节点的缓存积压区的数据,还是同步主节点的aof文件

Redis 的主从同步(replication)是同步主节点的数据到从节点上,但它既不是直接同步 AOF 文件,也不是同步缓存积压区。 当一个 Redis 从节点启动并连接到主节点时,会发生以下步骤: 同步数据集:从…...

Unity年中大促618活动又来了3折模板特效角色动画插件工具FPS生存建造模板RPG和2D素材优惠码UNITY6182024限时20240611

独立游戏开发需要找各种美术资源和模板,可以在低价时看看,节省开发时间。 Unity年中大促618活动又来了3折模板特效角色动画插件工具FPS生存建造模板RPG和2D素材优惠码UNITY6182024限时202406111104 300 款Unity引擎适配资源 3 折特惠,结账时输…...

【MyBatis-plus】saveBatch 性能调优和【MyBatis】的数据批量入库

总结最优的两种方法: 方法1: 使用了【MyBatis-plus】saveBatch 但是数据入库效率依旧很慢,那可能是是因为JDBC没有配置,saveBatch 批量写入并没有生效哦!!! 详细配置如下:批量数据入…...

前端三剑客之JavaScript基础入门

目录 ▐ 快速认识JavaScript ▐ 基本语法 🔑JS脚本写在哪? 🔑注释 🔑变量如何声明? 🔑数据类型 🔑运算符 🔑流程控制 ▐ 函数 ▐ 事件 ▐ 计时 ▐ HTML_DOM对象 * 建议学习完HTML和CSS后再…...

Fyndiq买家号下单:自养号测评如何打造本土物理环境系统?

Fyndiq 是一个瑞典电子商务平台,我们通过该平台为渴望讨价还价的购物者提供一系列产品。该公司为希望以可访问的方式提高销售额的所有类型的零售商提供销售渠道。Fyndiq几乎是瑞典家喻户晓的存在,是瑞典折扣促销平台。以销售质优价廉的商品吸引了大量忠实…...

自动检测曲别针数量:图像处理技术的应用

引言 在这篇博客中,我们将探讨如何使用计算机视觉技术自动检测图像中曲别针的数量。 如图: [1]使用灰度转换 由于彩色信息对于曲别针计数并不重要,我们将图像转换为灰度图,这样可以减少处理数据的复杂度,加速后续的…...

【Git】多人协作 -- 详解

一、多人协作(1) ⽬前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git 基本操作,分支理解,版本回退,冲突解决等等。 申请码云账号,将远端信息 clone…...

Eureka和Nacos有哪些区别?

Eureka和Nacos都能起到注册中心的作用,用法基本类似。但还是有一些区别的,例如: Nacos支持配置管理,而Eureka则不支持。 而且服务注册发现上也有区别,我们来做一个实验: 我们停止user-service服务&#x…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

自定义线程池1.2

自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

在ubuntu等linux系统上申请https证书

使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具&#xff0c;支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申请证书 纯手动方式&#xff08;不自动配置&#xff09;&…...

[C++错误经验]case语句跳过变量初始化

标题&#xff1a;[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...