数据库约束与表的关系(数据库系列4)

news2024/11/25 20:26:49

目录

前言:

1.数据库的约束

1.1约束类型

1.1.1 not null

1.1.2 unique 唯一约束

1.1.3 default 默认值约束

1.1.4 primary key 主键约束

1.1.5 foreign key 外键约束

2.表的关系

2.1 一对一

2.2 一对多

2.3 多对一

3.新增

4.聚合查询

4.1聚合函数

4.1.1 count

4.1.2 sum

4.1.3 AVG

4.1.4 max

4.1.5 min

4.2 group by子句

4.2.1 分组前删选条件用where。

4.2.2 分组后删选条件用having语句。

4.2.3 where + having

5.联合查询 

5.1内连接

5.2外连接

5.3自连接

6.子查询 

7.合并查询

结束语:


前言:

在上一节中小编主要介绍了数据库中的CRUD操作,也在MySQL的客户端中给大家演示了具体的操作,那么有关于数据库的约束又是什么情况呢?这节中小编将与大家分享数据库约束和表的关系两大部分,大家来随小编的步伐一起来往下走吧!

1.数据库的约束

1.1约束类型

  • not null :指示某一行不能存储null的值。
  • unique:保证某列的每行必须有唯一的值。
  • default:规定没有给列赋值时的默认值。
  • primary key:相当于是not null和unique的结合,确保某列(或两个列多个列结合)有唯一标识,有助于更容易更快地找到表中的一个特定的记录。
  • foreign key:保证一个表中的数据匹配到另一个表中的值参照完整性。
  • check:保证列中的值符合指定的条件,对于MYSQL数据库,对check子句进行分析,但是忽略check子句。这个在MySQL5版本中是不支持的,但是写了不会报错,也没有什么实际的意义和效果,这里我们对check操作就不做过多的讨论了。

1.1.1 not null

现在我们重新来设置一个学生表结构。

现在我们来查看一下表的结构。

你会发现id这一行的第三列上面的那个null是NO。也就是说我们以后在插入值的时候我们是不可以给ID插入一个null值的。 

1.1.2 unique 唯一约束

指定某一列是唯一的,不重复的。在插入/修改数据的时候,会先查询,先看看数据是否已经存在,如果不存在就能够插入/修改 成功,如果存在,则插入/修改失败。

在没加唯一约束的时候,我们可以进行多次插入。

如果我们给id加上unique约束,如下所示:

我们会发现如果我们两次插入相同的id时就会发生错误,显示我们无法插入。他说是我们有重复的条目。 

1.1.3 default 默认值约束

默认值是insert指定插入的时候,其他未被指定的列就是按照默认值来进行填充。

我们可以在创建表的时候给指定默认值。

1.1.4 primary key 主键约束

主键我们可以理解为一条记录的身份标识,就像我们人一样,每一个人都有唯一的一串身份证号,这是我们每个人都不一样的标记。

它要求唯一且不能为空。所以主键就类似于unique + not null。但是也不完全就是。

在MYSQL中要求一个表中只能有一个主键,在创建主键的时候我们可以使用一个列来作为主键,也可以使用多个列来作为主键(复合主键),但是这里我们对复合主键不做过多的讨论。

当你多次进行插入相同的id值的时候,就会报错。 

 一个重要的问题:如何给这个记录安排一个主键呢?

MySQL自身只是能够检查是否重复,设置的时候还得是靠程序员来进行设置,此处MySQL中提供了一种简单粗暴的办法,那就是使用自增主键,auto_increment具体操作我们来看下面的客户端操作。

你会发现我们在插入数据的时候更本没有管id这一行的数据,但是系统帮我们就自动分配了。

注意:如果你是指定一个id值之后那么之后你如果不指定id值的话系统就会随着你的id值进行继续分配。 

1.1.5 foreign key 外键约束

外键用于关联其他表的主键或唯一键。

语法:

foreign key (字段名)reference 主表(列)

我们创建两张表,并把它们的classId进行关联。

此时我们就要求在student表中的每一条classID记录都要在class中能够找到,如果没有就会报错。

这里我就将class表叫做student的父表。

当你想要删除父表中的classID为1的信息的时候你会发现是删除不了的,当父表在约束子表的同时,子表也在约束着父表。

  

2.表的关系

设计表的时候我们分两步走。

  • 梳理清楚需求中的“实体”。
  • 梳理清楚实体之间的关系。

2.1 一对一

例如:

一个学生,只能有一个账号。

一个账号,只能提供一个学生所有。

方法一:
我们可以搞一张大表,同时包含学生信息和账号信息。(这里小编就简写了)

account-student (accountId,username,password, studentName);

方法二:
搞两个表,互相进行关联。

account(accountId,username, password, studentId);

student(studentId, name...);

方法三:
搞两个表。

account(accountId,username, password);

student(studentId, studentName, accountId);

2.2 一对多

例如:
一个班级可以包含多个学生。

一个学生只能对应一个班级。

方法一:
student(studentId, name);

class(classId,className,studentIdList);

注意:

相当于是在class表中搞了一个学生id的列表,但是MySQL中没有数组类型,不能这样搞,有些数据库是由这种类型的如Redis,在Redis中就可以考虑这样设计。

方法二:
class(classId,className);

student(studentId, name,classId);

2.3 多对一

 例如:
一个学生可以选择多个课程。

一个课程也可以提供给多个学生。

student(studentId, name);

course(courseId, name);

student_course(studentIdcourseId);//联合表,将上面的两张表进行关联起来。

3.新增

我们这里的新增是在上一节的基础上进行了一定的升级。

我们是将一个查询结果作为新增的内容放入到了insert语句中,如下所示:

这里我们要注意的是我们的列名可以不一样,但是数据类型一定要匹配。 

4.聚合查询

4.1聚合函数

函数说明
count()返回查询到的数据的数量
sum()返回查询到的数据的总和,不是数字没有意义
AVG()返回查询到的数据的平均值,不是数字没有意义
max()返回查询到的数据的最大值,不是数字没有意义
min()返回查询到的数据的最小值,不是数字没有意义

我们先来创建一张学生表。

4.1.1 count

我们计算一下学生表中一共有多少个学生。

4.1.2 sum

我们来计算一下这个班所有学生的各科的总成绩。

4.1.3 AVG

我们来计算一下这个班学生每一科的平均分是多少。

 计算一下三门科目总成绩的平均分。

4.1.4 max

我们来求一下每一科目的最高分是多少。

4.1.5 min

我们来求一下每个科目的最低分是多少。

4.2 group by子句

select中使用group by子句可以对指定列进行分组查询,需要满足:使用group by进行分组查询时,select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。

语法:

select 列名,聚合函数(),.... from 表名 group by 列名;

案例演示:

我们先来创建出一个emp表来。
现在我们来求出每个岗位的平均薪资。

4.2.1 分组前删选条件用where。

求每个岗位的平均薪资但是要除去孙悟空同学。

4.2.2 分组后删选条件用having语句。

求每个岗位的平均薪资,但是除去老板的。

 

4.2.3 where + having

也可以同时在分组前和分组后进行筛选。

5.联合查询 

5.1内连接

我们上面和之前所学习的都是在一个表中进行操作的,那么如何在两个表甚至是多个表中进行查询呢?这里我们就涉及到了联合查询。将多个表联合在一起进行查询。

我们在实际开发中往往数据是来自不同的表中的,所以需要多表联合查询,多表联合查询是对多张表的数据取笛卡尔积。

什么是笛卡尔积呢?下面我们通过几张表来进行演示一下。

但是我们会发现在笛卡尔积表中会有很多无效的数据,我们划掉之后就变成下面的这张表了。

 

 笛卡尔积是得到了一张更大的表,列数是两个表列数之和,行数是两个表行数之积。

案例演示:
首先我们先来创爱出三张表:

下面我们来查询一下“许仙”同学的成绩。

首先我们先来确定一下我们要找的关键字是学生名字和成绩,它两一个是在学生表中一个是在成绩表中。所以我们需要先将两张表进行笛卡尔积,将所需要的信息聚集在一张表中。

注意:这里的查询结果小编只是截取了一点。

我们要删除掉一些无用信息。我们可以通过学生表中的id和成绩表中的student_id来进行关联。

 这里我们也可以通过 表名.列名 的方式来指定列,一般推荐大家使用这个方法,以防万一两张表中的关键字是一样的,便于区分。

此时我们就只剩最后一步,在加上一个条件既可以查询到许仙同学的成绩了。

我们还可以对列进行简化。

这里我们来总结一下多表查询的一般步骤:

  1. 分析清楚需求中,涉及到的信息都在哪些表中。
  2. 针对这多个表进行笛卡尔积。
  3. 筛选出其中的有效数据。
  4. 结合需求中的条件,进一步的加强条件。
  5. 针对列进行精简。 

上述中我们在进行笛卡尔积的时候使用的是 进行笛卡尔积的,同样我们也可以使用 join 这个关键字来进行笛卡尔积,此时如果后续还要继续加强条件的时候我们使用的就不是where了而是on这个关键字。如下所示:

案例二:
查询所有同学的总成绩。

 

具体的实施步骤如下所示:

注意:
我们这里所讲的联合查询其实就是是内连接!!!其实内连接和外连接都是进行笛卡尔积。但是细节上是有所区别的。

5.2外连接

我先来创建出两张表,如下所示:

如果两个表中的数据不在是一一对应了,此时进行内连接,结果就只是两个表中都有体现的数据。

相当于我们之前学过的取两个集合的交集,如下所示:

左外连接,就是以左侧为准,将左侧表中的所有数据都体现出来。

如下示意图所示:

右外连接,就是以右侧的表为准将右侧表中的所有数据都体现出来。
如下示意图所示:

5.3自连接

自连接就是自己和自己进行连接,自己与自己做笛卡尔积。

6.子查询 

子查询是指嵌套在其他SQL语句中的select语句,也叫嵌套查询。

案例演示:

查询与“不想毕业”同学的同班同学。

查询语文或者英语课程的成绩信息。

注意:
子查询在实际开发的时候要慎重使用,因为一旦子查询嵌套太多层对于代码的可读性将会是毁灭性的打击!!! 

7.合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符union,union all,使用union和union all时,前后查询的结果集中,字段需要一致。

案例演示:

查询id小于3,或者名字为英文的课程。

通过上述情况我们可以看出来or只能针对一个表,而union可以把多个表的查询结果进行合并。

这里还有一个关键字是union all 它与union的区别就是union会自动去重而union all是不会自动去重的。 

结束语:

好了小编今天就与大家分享到这里啦,这节中小编主要与大家分享了数据库中的一些约束、联合查询、怎么进行内连接、怎么进行外连接、自连接和合并查询,不知道大家对这块知识有没有掌握,大家记得下去之后多加练习哦!大家继续跟紧小编的步伐,一起往前冲!!!希望这节对大家认识数据库有一定的帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

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

相关文章

Pinecone - 向量数据库

文章目录 关于 PineconeRoadMapSemantic SearchChatbots购买查看 API Key创建索引代码调用安装库 pinecone-client查看已经创建的索引创建索引插入数据获取索引统计分析信息查询索引,获取相似向量删除索引关于 Pinecone 官网 : https://www.pinecone.i

利用layui构建OA系统基本操作

一.编写方法(增加,删除,修改,查询) 通过继承BaseDao来实现通用,从而减少代码量,提高小路 1.增加 public int add(User user) throws Exception {String sql "insert into t_oa_user(name…

Windows7中使用SRS集成音视频一对一通话

SRS早就具备了SFU的能力,比如一对一通话、多人通话、直播连麦等等。在沟通中,一对一是常用而且典型的场景, 让我们一起来看看如何用SRS做直播和RTC一体化的一对一通话。 一、启动windows7-docker 二、拉取SRS镜像 执行命令:docker pull oss…

修改jar包中的文件内容

文章目录 导引查找是否存在需要修改的文件vim命令修改配置文件jar命令替换jar包中的文件(也可新增)解压jar包,修改后重新打包jar修改clas文件jar命令参数 导引 首先问问为什么要直接修改jar包中的文件,而不是重新打包,在非必要的情况下&…

【动手学深度学习】pytorch-参数管理

pytorch-参数管理 概述 我们的目标是找到使损失函数最小化的模型参数值。 经过训练后,我们将需要使用这些参数来做出未来的预测。 此外,有时我们希望提取参数,以便在其他环境中复用它们, 将模型保存下来,以便它可以在…

python数据挖掘基础环境安装和使用

文章目录 一.安装python环境二、库的安装2.1 使用pip命令安装virtualenvv扩展:cmd无法使用pip,报错:Fatal error in launcher: Unable to create process using ... 2.2 安装virtualenvwrapper-win2.3 新建一个用于人工智能环境的…

腾讯云 API 3.0(V3版签名) 通用接口 Delphi 版

目录 一、腾讯云API 3.0 简介: 二、Delphi 接口函数说明: 1. Delphi 接口包含的单元: 2. 同步调用和异步调用的区别: 3. 程序调用示例: 三、Delphi 版腾讯云API 3.0 版接口函数下载 四、演示程序录播 下载源程序…

DB2数据库SQL将不同行做合计

DB2数据库SQL将不同行做合计 案例: 将’GL’和’RZ’做合计,其他的不动。 SELECT SALE_TYPE,ROUND(CAST(SUM(aatp_weight) AS DOUBLE),2) AS aatp_weight FROM( SELECT CASE WHEN SALE_TYPE GL THEN RZ ELSE SALE_TYPE END AS SALE_TYPE, DEMAND_NUM / …

基于NXP iMX8MP处理器M7核心LVGL移植

By Toradex胡珊逢 LVGL (Light and Versatile Graphics Library)是一个轻量级的开源图形库,采用 C 或者 MicroPython 语言开发。可以在资源有限的 MCU 上轻松地绘制图形界面。Verdin iMX8M Plus 模块的处理器除了 Cortex-A53 核心外,还具有一个 Cortex-M…

如何运营校园外卖跑腿小程序

运营校园外卖跑腿小程序需要考虑多个方面,包括市场调研、合作伙伴选择、用户获取与留存、服务管理和推广等。下面是一些关键步骤和策略: 市场调研: 在开始运营之前,进行市场调研是非常重要的。了解目标用户的需求和习惯&#xf…

HarmonyOS学习路之方舟开发框架—方舟开发框架(ArkUI)概述

方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面…

JVM系列(6)——类加载器详解双亲委派

一、类加载器 类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。 主要作用就是加载 Java 类的字节码( .class 文件)到 JVM 中(在内存中生成一个代表该类的 Class 对象)。 加载过程可以看 JVM系列&a…

人工智能-反向传播

前面阐述过,在设计好一个神经网络后,参数的数量可能会达到百万级别,利用梯度下降去更新参数计算复杂,算力不足,因此需要一种有效计算梯度的方法,这种方法就是辛顿提出的反向传播(简称BP&#xf…

【算法基础】搜索与图论

DFS 全排列问题 842. 排列数字 - AcWing题库 #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int x) {if(x>n){for(int i1;i<n;i) cout<<path[i]<<" ";cout<<endl;return ;…

高级测试工程师求职之路:从笔试到面试,我经历了什么?

最近行业里有个苦涩的笑话&#xff1a;公司扛过了之前的三年&#xff0c;没扛过摘下最近的一年&#xff0c;真是让人想笑又笑不出来。年前听说政策的变化&#xff0c;大家都满怀希望觉得年后行情一片大好&#xff0c;工作岗位激增&#xff0c;至少能有更多的机会拥抱未来。然而…

【每日一题】979. 在二叉树中分配硬币

【每日一题】979. 在二叉树中分配硬币 979. 在二叉树中分配硬币题目描述解题思路 979. 在二叉树中分配硬币 题目描述 给你一个有 n 个结点的二叉树的根结点 root &#xff0c;其中树中每个结点 node 都对应有 node.val 枚硬币。整棵树上一共有 n 枚硬币。 在一次移动中&…

计算机体系结构基础知识介绍之线程级并行性及其利用

线程级并行&#xff08;Thread Level Parallelism&#xff0c;TLP&#xff09;是指在多个处理器或多个核心上同时执行多个线程&#xff0c;从而提高程序的性能和吞吐量。线程级并行的基本原理是利用程序中的数据或任务的并行性&#xff0c;将程序划分为若干个相对独立的子任务&…

c++游戏小技巧7:system 综合

目录 1.日常前言&#xff1a; 2.system 1.换标题&#xff1a;title 2.更改运行框大小 mode cons 3.清屏 cls 4.关机 shutdown 1.电脑多累啊&#xff0c;让他休息一下吧(直接关机) 2.电脑虽然很累&#xff0c;但是还想工作一会再睡(定时关机) 3.不让电脑休息的极其不友善…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览&#xff1a; rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定&#xff1a; 分开的范围之间可用逗号隔开&#xff0c;最后再用一个小括号括起来。F4可以快速锁定行和列。…

Python深度强化学习实战 ——OpenAI Gym-CarRacing自动驾驶项目

&#x1f4ad; 写在前面&#xff1a;本篇是关于 OpenAI Gym-CarRacing 自动驾驶项目的博客&#xff0c;面向掌握 Python 并有一定的深度强化学习基础的读者。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个…