当前位置: 首页 > 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…...

如何正确使用 include-what-you-use

简单地说,由 Google 开发的 include-what-you-use(IWYU)让源代码文件包含代码里用到的所有头文件。这种方法确保在改动了一些接口之后,代码依然最有可能编译成功。 之前我写了一篇关于 include-what-you-use 工具的文章&#xff…...

企业内网安全软件分享,有什么内网安全软件

内网安全? 其实就是网络安全的一种。 什么是内网安全软件? 内网安全软件是企业保障内网安全的一种重要工具。 它主要帮助企业实现对网络设备、应用程序、用户行为等方面的监控和管理,以预防和应对各种网络攻击。 这类软件主要用于对内网中…...

【摘葡萄game】

您想要了解的“摘葡萄游戏”可能是一个编程项目或者是一个编程相关的练习。我可以提供一个简单的摘葡萄游戏的思路和代码示例。这个游戏可以用多种编程语言来实现,比如Python、Java等。这里我以Python为例,给出一个基础版本的摘葡萄游戏的概念和代码。 …...

java如何实现字符串连接

在java中,字符串与字符串连接可以用运算符和 比如有字符串a,字符串b 想要把a和b连接起来,定义一个字符串变量c cab 或者 ab 示例代码 public class Zifuchuanlianjie {public static void main(String[] args) {String a"我叫李狗蛋";S…...

流量卡选卡攻略,拯救不会选流量卡的小白!

​ 家人们,你们知道不,选择一款性价比高的流量卡,真的超级省钱。 一、首先,说一说申请。 运营商推出线上流量卡,注意是线上的流量卡,都是免费领取,运营商包邮到家,在激活充值之前不…...

python class __format__ __bytes__区别

在Python中,__format__和__bytes__是两个特殊方法,它们允许对象自定义它们在特定情境下的字符串表示。以下是这两个方法的区别和作用: __format__ 作用:__format__方法用于定义对象在使用format()函数或格式化字符串&#xff08…...

C++ | Leetcode C++题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n gas.size();int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i …...

【Linux】ls命令

这个命令主要是用于显示指定工作目录下之内容&#xff08;列出目前工作目录所含的文件及子目录)。 掌握几个重点的常使用的就可以&#xff1a; ls -l # 以长格式显示当前目录中的文件和目录 ls -a # 显示当前目录中的所有文件和目录&am…...

多态、虚函数表与动态绑定的深入解析

目录 多态简介 虚函数表与动态绑定 虚函数表 动态绑定机制 内存与性能影响 纯虚函数与抽象类 纯虚函数 抽象类 动态类型转换与typeid操作符 dynamic_cast typeid操作符 虚析构函数的重要性 在面向对象编程中&#xff0c;多态性是一种核心特性&#xff0c;它允许我们…...

VitePress+Docker+jenkins构建个人网站

VitePress官网 VitePress | 由 Vite 和 Vue 驱动的静态站点生成器 可以理解为一个前端脚手架:快速生成个人站点 最好先大概看一遍 快速开始 | VitePress 可以在线体验一下 安装条件 node -v 检查下node版本 在D盘创建一个文件夹 例如:VitePress 进入文件夹 cmd npm ini…...

ps做图 游戏下载网站/seo优化的方法

【neo4j】出入度计算 1.度&#xff1a;size((n)--())2.出度&#xff1a;size((n)-[]->())3.入度&#xff1a;size(()-[]->(n))1.度&#xff1a;size((n)–()) 2.出度&#xff1a;size((n)-[]->()) 3.入度&#xff1a;size(()-[]->(n))...

乌镇网站建设投标书/百度推广如何计费

什么是Dynamic Island Dynamic Island 是一项功能,可调整 iPhone 14 Pro 和 iPhone 14 Pro Max 上药丸形凹口的大小。调整大小让黑色区域包含更多信息、交互式信息,您可以点击或长按以访问不同的功能。 脚步 我们需要创建一个带有 Widget Extension 的项目。你可以参考之前的…...

湖南网络公司网站建设/网络营销代运营外包公司

相比传统的Windows桌面系统&#xff0c;Linux VDA现在还是相对小众&#xff0c;但是在一些设计、开发&#xff0c;用户还是有需求的&#xff0c;所以目前作为虚拟桌面大厂Citrix从去年开始研发Linux VDA&#xff0c;在上个月Linux VDA的Technical preview已经发布了。 目前Citr…...

独立做网站/海外短视频软件

一、IPC (Inter-Process Communication)&#xff1a; --中文翻译是线程间的通信 消息队列共享内存&#xff08;效率最高&#xff09;信号灯集二、客户端命令&#xff1a; ipcs&#xff1a;--用来查看system V的IPC机制标识符的命令-q&#xff0c;显示当前系统中 消息队列 的…...

wordpress网页提速/百度推广销售员的工作内容

众所周知Jboss依赖于JMX来装载MBean服务&#xff0c;而这些MBean服务组成了具体服务器实例的差异性。标准JBoss发布版本提供的所有功能都是基于MBean的。所以&#xff0c;如果要为JBoss服务器添加新的服务&#xff0c;最好的方法是开发自己的JMX MBean服务。MBean服务的生命周期…...

购物网站如何做/如何在外贸平台推广

OpenCV cv.InRange功能是否仅适用于RGB图像&#xff1f;我可以使用此功能对灰度图像进行阈值处理吗&#xff1f;我收到一个错误,以下是我的代码&#xff1a;import cv2imagecv2.imread("disparitySGB.jpg")threshcv2.inRange(image,190,255);它给出以下错误&#xff…...