表的设计与查询

目录

一、表的设计

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一样:

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

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

相关文章

Selenium三种等待方式的使用!

UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作。但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1、有frame;2、没有设置等待。 因为代码运行速度和浏览器…

如何有效释放Docker占用的存储空间

随着Docker的广泛应用,我们经常会遇到Docker占用过多存储空间的问题。这可能是由于频繁的镜像拉取、容器创建和删除等操作导致的。本文将介绍几种方法来有效释放Docker占用的存储空间,特别是docker system prune命令的使用。 Docker的存储机制 Docker使…

体验SmartEDA:颠覆传统,设计流程更流畅,超越Multisim与Proteus!

在电子设计自动化(EDA)领域,传统软件如Multisim和Proteus一直是工程师们的得力助手。然而,随着科技的飞速发展和用户需求的不断升级,一个全新的EDA平台——SmartEDA正崭露头角,凭借其更为流畅的设计流程&am…

【验收支撑文档】软件验收计划书

软件系统验收计划书是确保新开发的软件系统符合预期要求并稳定运行的关键步骤。本计划书概述了验收过程的主要环节,包括系统功能的详细测试、性能评估、用户接受度测试以及文档完整性的核查。验收团队将依据项目需求规格说明书和合同要求,对系统进行全面…

网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业

很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样。 算上从学校开始学习,已经在网安这条路上走…

简单了解java中的异常

异常 1、异常的概述 1.1、概述 异常就是程序出现了不正常的情况,程序在执行过程中,数据导致程序不正常,最终导致JVM的非正常停止。语句错误不算在异常体系中。 1.2、异常的存在形式 异常有类型之分,比如我们比较熟悉的数组越…

Nginx服务配置

一、Nginx服务的主配置文件nginx.conf vim /usr/local/nginx/conf/nginx.conf 全局块:全局配置,对全局生效;events块:配置影响 Nginx 服务器与用户的网络连接;http块:配置代理,缓存&#xff0c…

C语言怎样初始化图形模式?

一、问题 在C语⾔中,initgraph( ) 函数⽤于初始化图形模式。初始化时,那么多参数都是⼲什么的?怎样设置? 二、解答 initgraph( ) 函数⽤于初始化图形模式,其语法格式如下。 void far initgraph(int far * gdriver, i…

Nginx学习笔记(十)如何配置HTTPS协议?(公网)

目录 一、简介二、SSL 证书类型介绍三、公网 SSL 证书3.1 证书管理工具3.2 下载安装 acme.sh3.3 申请并下载证书报错1:没有指定账号报错2:DNS无法解析的域名报错3:无效的响应 404 3.4 配置 Nginx3.5 证书过期刷新 四、补充4.1 同一域名的不同…

局域网测速

对于网管来说,企业局域网络的速度是知道的,因为网管清楚企业局域网络的拓扑结构、网络链路、网络设备以及实际到桌面的情况。 有时候即使千兆到桌面实际因为影响的因素多,实际的网络速度可能会打一定的折扣,那么就需要清楚实际的网…

【数学建模】微分方程的数值求解

微分方程的数值求解 一阶差分求解微分方程原理:四阶龙格-库塔方法应用:小船渡河问题: 进阶求二阶微分方程 一阶差分求解微分方程原理: d y d x f ( x n , y n ) \dfrac{dy}{dx}f(x_n,y_n) dxdy​f(xn​,yn​) y n 1 − y n x n 1 − x n f ( x n , y n ) \dfrac{y_{n1}-y_n…

VMware导入vmdk文件(亲测有效)

场景:从别的地方拷贝了一个系统镜像,实际测试案例是从vulnhub下载的Kioptix Level #4靶场解压缩以后的文件是【Kioptrix4_vmware.vmdk】后缀为名为vmdx,使用常规的方式【文件-----打开】的方式,不能导入虚拟机,现在演示如何导入到…

Java——类和对象

在Java中,类与对象是面向对象编程(OOP)的核心概念。那面向对象又是什么呢。 一、面向对象和面向过程 1、面向对象 面向对象(Object-oriented)是一种程序设计的方法和编程范式,它以对象作为程序的基本单位…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

品牌渠道健康发展的关键与方法

一个品牌的渠道健康与否对其长期发展至关重要。品牌虽多,但并非所有产品都能成为品牌,创建品牌需大量精力,而让品牌长久健康发展则需多方面努力。 力维网络服务众多知名品牌,总结出一些渠道治理方法供品牌参考。首先,管…

前端JS必用工具【js-tool-big-box】学习,获取当前浏览器向上滚动还是向下滚动,获取当前距离顶部和底部的距离

这一小节,我们说一下 js-tool-big-box 添加的最新工具方法,在日常前端开发工作中,如果网页很长,我们就需要获取当前浏览器是在向上滚动,还是向下滚动。如果向上滚动,滚动到0的时候呢,需要做一些…

【Mongodb】Mongodb亿级数据性能测试和压测

一,mongodb数据性能测试 如需转载,请标明出处:https://zhenghuisheng.blog.csdn.net/article/details/139505973 mongodb数据性能测试 一,mongodb数据性能测试1,mongodb数据库创建和索引设置2,线程池批量…

React+TS前台项目实战(六)-- 全局常用组件Button封装

文章目录 前言Button组件1. 功能分析2. 代码注释说明3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局按钮组件封装,可根据UI设计师要求自定义修改。 Button组件 1. 功能分析 (1)可以通过className属性自定义按钮样式,传递…

【计算机网络基础】OSI七层网络模型 TCPIP四层网络模型

文章目录 ISO介绍网络模型介绍OSI七层模型OSI七层模型介绍OSI七层特点一、TCP/IP四层模型介绍二、TCP/IP四层模型TCP/IP协议簇一次C/S通信 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分…

校验参数个数工具类

项目中有个需求:前后端参数一致性校验,在某业务场景下后端代码需要校验参数个数,因此设计了1个工具类方便大伙使用,特此简单记录下。 校验参数个数工具类 一、校验工具类CheckNumInsideParamters二、单元测试ParameterSizeTest三…