IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【MySQL】数据库(二)【进阶内容】数据库约束+表的设计+进阶新增和查询(简单易懂) -> 正文阅读

[大数据]【MySQL】数据库(二)【进阶内容】数据库约束+表的设计+进阶新增和查询(简单易懂)

我是目录哦🤯:

一、🦗MySQL数据库的约束:

????????1、🦕约束这玩意儿到底是什么呢?

? ? ? ? 2、🦕约束要怎么使用啊?

? ? ? ? ?2.1、🦥NOT? NULL:NULL约束

????????2.2、🦥UNIQUE:唯一约束

????????2.3、🦥DEFAULT:默认值约束

????????2.4、🦥PRIMARY KEY:主键约束

????????2.5、🦥FOREIGN KEY:外键约束

二、🦗表的设计:

? ? ? ?1、🦕表的设计啥意思啊?

? ? ? ? 2、?🦕实体之间有哪些关系呢?

????????1.1、🦥一对一关系

? ? ? ? 1.2、🦥一对多关系

? ? ? ? ?1.3、🦥多对多关系

三、🦗进阶新增和查询:

? ? ? ? 1、🦕插入查询结果

????????2、🦕聚合查询

????????2.1、🦥聚合函数?编辑

? ? ? ? 2.2、🦥分组操作 group by


一、MySQL数据库的约束:

????????1、约束这玩意儿到底是什么呢?

? ? ? ? 打个比方:我是一个合唱队的领队,我想让我的这一支合唱队参加比赛,甚至还想拿个奖啥的;可是我这一只合唱队不是很平凡,有的人老是喜欢飙高音(某高音哥)、有的人五音不是很全(某波澜哥)、有的人唱歌比较亢奋(某面筋哥),有这些选手存在,每次排练我都很苦恼,后来我想了个办法,就是在他们排练的时候将他们都“约束”住。你喜欢高音是吧?排练的时候唱低音;你唱歌跑调?那就进入三声队;你唱歌亢奋?直接绑起来不许动弹。
? ? ? ? 经过我这么一整顿,合唱队的合唱效果果然就好了很多。如果将合唱队比作数据表的话,那么这些“约束”操作就可以更好的帮助我对数据更进一步的限制,更好的进行校验;也保证了数据的正确性、有效性,和完整性。

? ? ? ? 2、约束要怎么使用啊?

? ? ? ? 要想使用数据库约束,我们得先来看看数据库里有哪些常见的约束类型:

? ? ? ? ?2.1、NOT? NULL:NULL约束

????????在创建表的时候在列后面加上not null,表示这一列不允许为空值(null)。例如,这里我就创建了一个animal表,其中,我对cat这一列添加了关键字 not null ,使得这一列不能为空值(null)了,若对其插入空值,则会直接报错。:

????????来查看下这个animal表的结构:

????????可以看到Null这一列里,只有cat为No,意思为不可以为null。那么我们再来试试往cat这一列插入空值,看看是否真的不能插入:

? ? ? ? 可以看到已经报错了,它提示我们cat这一列不能为“null”。
? ? ? ? 在同一个表中是可以给不同的列都设置 not null 的,例如我们删掉刚刚的animal表,把cat列、dog列和bird列都设为not null :

? ? ? ? 如上图中也都成功的把三个列都设为了 not null 了。

????????2.2、UNIQUE:唯一约束

? ? ? ? 啥叫唯一约束呢?顾名思义,就是指当我们指定了任意一列为UNIQUE的时候,这一列里的值就是在整张表里是唯一的,不会在有其他的列和它出现重复了!

????????举个栗子,还是创建一个咱们的animal表,包含name列和age列;我这里将age列设为Unique,表示每个小动物的年龄都是唯一的:

? ? ? ? ?好,那我们再来插入一些数据验证一哈是否真的是只能唯一:

? ? ? ? 咱们可以在上图看到,插入10岁的小猫和9岁的小狗时,是可以成功的,但是当插入10岁的小鸟的时候就插入失败了,这是为什么??因为之前我们对age这一列设置了unique约束,所以就不可以插入相同的age值了!

????????2.3、DEFAULT:默认值约束

? ? ? ? 假如说我是一个老师,我现在在改学生的期末试卷,可是在改的过程中我发现,有很多的学生最后一大题没写,那我出于想让学生们考个高分回家过年的目的,自己偷偷给那些没写最后一大题的学生自己写上了(哈哈哈真会有老师这么干吗?),这样他们就能尽量考个高分了!

? ? ? ? 那么默认值约束也是类似,如果我们在表里插入数据的时候,假如某一列没写,数据库会自动为我们填补上设置好的默认值(难道它也是于心不忍?hhh)。

? ? ? ? 还是拿animal表举例,假设创建的时候给age列添加一个Default约束:

? ? ? ? ?咱们可以看到在desc查询表结构的时候,age的default一栏变为了3!而name列因为没设置所以为null;意思就是如果咱们插入数据的时候没有插入age列,那么数据库会自动给我们分配一个默认值3:

? ? ? ? ?一般情况下数据库的默认值是null,但是当我们设置了Default约束后,如果只是指定列插入,此时age列的值就会变为3!

????????2.4、PRIMARY KEY:主键约束

? ? ? ? 主键约束呢,就相当于我们大中国的公民身份证一样,你不能没有,不然你就是黑户或者偷渡移民;你也不能有多个,一般这种都是违法乱纪的大坏蛋,通通都得抓起来!所以给数据库某一列添加了主键约束也是一样的,这一列不能为空!否则你就是没有身份证的黑户!一张表里也不能有多个主键!

? ? ? ? 所以说Primary Key 就像是Unique和Not Null的集合,相当于数据的唯一标识。

????????这里我创建的animal表中,将动物id设为了主键:

????????我们发现id那一列的null栏,变为了No,表示不可以为空。

????????然后来验证下能否插入空值、主键能否重复:

? ? ? ? ?当我们给id列插入null时报错了,而给age列插入null却可以,同样的当再插入一条id为1数据时就不允许插入了!

? ? ? ? ?以上我们讲了关于主键的特性,下面我们讲讲主键的典型用法“自增主键”!一听到这个名字大家想必应该能猜到个大概吧?没错!就是说这个主键可以自己增加!那么这个自增主键具体长啥样呢?

? ? ? ? 例如上图,在主键primary key 后面加上 auto_increment ,这样就表示这个主键变为了自增主键,那么问题又来了,自增主键干哈用的???

? ? ? ? 当我们设定好自增主键后,此时插入数据就可以不必自己手动设置主键的值了,直接用null来代替,此时数据库会帮我们自动分配。例如:

? ? ? ? ?如上图所示,尽管我们在插入数据的时候并没有给主键id列插入数据,而是指定了null,但是在查询表的时候依旧会显示出这些小动物的id列,这就是自增主键的作用!

? ? ? ? 当然了,除了让系统自动分配外,同样也可以自己手动来输入主键列的值:

? ? ? ? ?但是这样的话,下次再使用自增主键的时候,就会按照你上一次输入的主键值来增加了:

? ? ? ? ?注意:只能是对于整数类型主键,才可以使用自增主键!

????????2.5、FOREIGN KEY:外键约束

? ? ? ? 外键约束啥意思呢?就比如说假如小动物只分三种:一种是天上飞的、一种是地上跑的、一种是水里游的,这些都是小动物的技能,我们把这三个技能合成一张表,那么不管我们新建什么小动物,都不会逃出这个技能表的范围。我们就说动物表和技能表形成了外键约束,这里动物表称为子表,技能表成为父表,子表依赖于父表。

????????根据上面的栗子,我们可以创建出一个技能表:

? ? ? ? 在上表中显示了每个动物会的技能,所以我们在构造动物表的时候,就不能构造出一个三界之外的动物(会其他的技能或者这三个技能都不会),那接下来构造一个动物表,指定一下外键约束:

? ? ? ? 在上动物表中,指定了skillId为外键,表示关联了skill表里的sillId这一列;外键约束,描述的是两张表之间的“依赖关系”。此时我们再往动物表里插入数据时就不能随心所欲了,必须得按照父表skill表来:

? ? ? ? 创建技能表的时候我们知道,1表示会飞、2表示会游、3表示会跑,那么前三个记录的插入是没有问题的,小鸟会飞,小鱼会游,小猫会跑,但是后三个的插入为什么就报错了?

? ? ? ? 因为我们对animal表的skillId设置了外键约束,只有输入skill表里有的值时,才会插入数据成功,否则就会失败。

????????然而我们不仅仅是在新增数据的时候需要考虑到外键约束,在对新增的数据进行修改的时候也需要考虑到外键约束,例如我现在对第三行记录小猫进行修改,试图将它的skillid改为4:

? ? ? ? ?可以看到,如果我要将skillId改为skill表里不存在的4时,会提示报错;但是改为2时,就可以成功修改。

? ? ? ? 外键约束不只是约束子表(animal),同样也会约束父表(skill),当父表中的某条记录被子表约束着的时候,就无法进行修改和删除:

? ? ? ? ?经过上面一系列操作,我们发现此时的animal表里是没有动物的skillId为3的,那我们试一下删除skill表id为2和3的记录:

? ? ? ? ?因为skillId = 2的记录被子表依赖着,所以无法删除,但是skillid = 3的记录因为不被任何子表依赖,所以就删除成功了,修改也是同理。

????????外键约束的工作原理:在子表里插入数据时,会先根据对应的值,在父表中先查询,查询到之后才能进行插入等操作。注意:子表和父表的依赖关系不是一对一的,因为它们之间根本就不是以表为单位,而是以列为单位,当一个表A中的某一列依赖于另一个表B中的某一列时,此时就称A为子表,B为父表;而A中的其他列也可以依赖与其他表里的列,这样同样也会形成依赖关系。

二、表的设计:

? ? ? ?1、表的设计啥意思啊?

????????所谓的“数据库设计”或者“表的设计”其实就是根据实际的问题场景,创建出相应的数据表。如果有问题问到:跟你一个问题场景,任何设计数据库,如何设计数据表?那么一个通用的办法就是:先找出这个场景中所涉及的“实体”,然后再根据生活经验分析这些“实体”之间的关系。

????????那么什么又是“实体”呢?通俗来讲,就是现实生活中出现的具体事物,一些具体存在的器具、生物或者一些名词。例如:人、小猫小狗、锄头、订单、身份信息······

? ? ? ? 举个栗子:在一座学校里,有班级,班级里有学生,学生们在上着课。那么在这个系统里,“学生”、“班级”和“课程”就是我们需要找的实体!这时候,我们在创建表的时候就可以依据实体来创建出三张表:学生表,包含了有哪些学生;班级表,包含了一座学校里有哪些班级;课程表,包含了学生们所需要上的全部课程。

? ? ? ? 可是在很多时候,实体和实体之间也并不都是孤立的,而是存在着一些关联关系。我们创建表的时候也是需要将这些关系给体现出来。

? ? ? ? 2、?实体之间有哪些关系呢?

????????1.1、一对一关系

? ? ? ? 比如将学生在学校里的档案,每一个学生都对应一份属于自己的档案,而每份档案也对应这一个学生。

? ? ? ? 1.2、一对多关系

? ? ? ? 就是一个实体对应着多个实体,例如学生和班级,一个学生只属于一个班级里,而一个班级里却包含多个学生。

? ? ? ? ?1.3、多对多关系

? ? ? ? 多对多关系相对来说比较复杂,比如班级和课程之间,一个班级可以上多个课,而一个课也可以被多个班讲授。

? ? ? ? ?所以在数据库创建中,往往需要使用一个关联表来表示它们之间的关系。

?

? ? ? ? ?三、进阶新增和查询:

? ? ? ? 1、插入查询结果

? ? ? ? 当我们乍一看,诶?插入查询结果啥意思?你查询就查询,插入就插入,怎么还混一起了呢?其实,这个操作就是把插入和查询结合在一起的新增操作。意思就是把上一个表的查询结果作为这一个表的插入数据。

????????我们来举个例子:我这里有两个表A和B,A中有三行记录,B是个空表,没有数据。

? ? ? ? 刚刚我们对A表进行全列查询得出的结果如上图,如果现在我想把刚刚查询出来的数据全部插入到B中,那么按照我么之前学的方法是不是得一行一行的插入?还是比较麻烦的,那么插入查询结果这个操作就可以很好的帮助我们解决这个问题,它可以将刚刚查询的结果直接全部插入到B表中:

insert into 表名1 select 列名 from 表名2;

????????上图可以看到,我们只进行了一个操作就把对A表查询的结果插入到了B表中,非常快捷!

? ? ? ? 而我们刚刚创建的A表和B表的列名顺序恰好相同,此时是可以插入查询结果成功的,那么我们调换一下B表的列名顺序,将name列和id列换一下:

? ? ? ? 那么这样之后再进行刚刚的操作会不会成功呢?

? ? ? ? ?可以看到,这次这个操作不但没有成功,反而还报错了,提示我们整数值不正确,这是为什么呢?原来我们name 列的类型是 varchar,而A表查询的结果第一列是id 类型为 int ,所以这两个类型不匹配,插入失败。经此我们知道了,在插入查询结果的过程中,需要保证列和列之间的类型是相互匹配的。

? ? ? ? 另外呢,我们也可以给select 查询操作后面加上一些条件,例如排序、去重······

????????2、聚合查询

????????2.1、聚合函数

? ? ? ? ?下面我们用一个score(成绩)表来演示一下这些函数:

? ? ? ? 【count】:

? ? ? ? ?我们先来查询一下这张表里有多少数据:

? ? ? ? ?再来看看语文成绩在90分以上的有多少位同学:

? ? ? ? ?查询出来的结果是3,和事实相符。由于上面score表的数据都是有数值的,那么 count 遇到Null,会不会增加计数呢?这里我先添加一行english为null的记录:

????????然后再对英语这一列的成绩进行计数查询:

? ? ? ? 发现最后查询的结果居然还是6,没有发生改变,由此可以得出,count 函数是不会对 null 来计数的。

????????【sum】:?

? ? ? ? sum 函数,是进行求和,即对这一列的若干行的数据进行相加。例如,我将所有同学的语文成绩加起来:

????????或者将所有同学的语文和英语成绩加起来:

? ? ? ? 聚合函数查询是不仅可以使用列名,也可以使用表达式来进行查询,比如来查询一下三门课成绩加起来的总和:

?????????【max & min】:

? ? ? ? 这里我来查询一下语文成绩的最大值和最小值:

? ? ? ? ?聚合函数除了这些基本的查询之外,还可以搭配 where 关键字来使用,先基于条件进行筛选,再把这些筛选结果进行聚合。

? ? ? ? 例如我查询一下数学成绩大于70分的同学的数学成绩总和:

? ? ? ? 2.2、分组操作 group by

????????分组操作是根据某一列的行值,把这一列相同行值的数据划分为一组,再根据聚合函数对数据进行计算和查找。

????????这里有一张职位表:

????????首先需要确立按那一列的行值来分组,这里很明显使用role列来进行分组,再根据分组后的数据进行聚合函数查询:

? ? ? ? ?进行分组之后可以对这些查询结果进行筛选,此时就需用到 having 关键字;比如,刚刚的查询结果我不想看到医生的数据:

? ? ? ? 分组操作也可以搭配where来使用,只不过它和 having 的区别在于where 是在分组之前进行筛选,而having是在分组后进行筛选。


End~~~

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:15:37  更:2022-05-24 18:16:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:33:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码