☕目录☕
🍚前言
🎂🎂1.1 约束类型
🍜三、新增
🍰四、查询
🥘🥘4.1 聚合查询
🍛🍛🍛4.1.1 聚合函数
🍣🍣🍣4.2.1 笛卡尔积
🍗🍗🍗4.2.2 内连接
🥐🥐🥐4.2.3 外连接
🍟🍟🍟4.2.4 自连接
🌭🌭🌭4.2.5 子查询
🍝🍝🍝4.2.6 合并查询
🍨后续
前言
老规矩~~
为了本篇博客的学习,先把 MySQL数据库 里面的表 全部都删除掉~~
只留下自己创建的java数据库(自带的数据库肯定是不动的了)~~
一、数据库约束
所谓的约束~~
其实就是 数据库可以让程序员定义一些对数据的限制规则,数据库 会在 插入/修改数据的时候,会按照这些规则 对数据进行校验~~
如果校验不通过,就直接报错~~
约束的本质 就是让我们及时发现数据中的错误,更好的保证数据的正确性~~
1.1 约束类型
not null | 指示某列不能存储 null值(即 该列是必填项) |
unique | 保证某列的每行必须有唯一的值 |
default | 规定没有给列赋值时的默认值 |
primary key | not null 和 unique 的结合。确保某列(或两个列或多个列)有唯一标识,有助于更快速的找到 表中的一个特定的记录 |
foreign | 保证一个表中的数据 匹配 另一个表中的值的参照完整性 |
check | 保证列中的值符合指定的条件 |
1.2 null约束
此时,先创建一张 student表:
这张表,初始情况下,没有任何的约束,允许为null:
此时,我们完全可以插入空值:
但是,如果我们加上 not null,那么就不会插入成功了~~
删除上面所创建的 student表:
重新创建一个 student表(有约束条件 not null):
查看 student表 的结构,发现此时 id列不允许为空:
此时,如果再插入空值的时候,会提示报错:id列不允许为空值:
这个是由于创建 student表 的时候,在 id列 设置了 not null~~
使得在下面插入数据的时候,id列 不允许插入空值~~
1.3 unique约束
unique约束,是保证 唯一性约束~~
首先,删除 原来的 student表:
先创建一个普通的表(无任何约束):
插入多条相同的记录,发现插入记录都成功了:
此时,查询 student表 的全列数据:
可以看到的是,创建的是普通的表(无unique约束),
此时,是完全可以插入普通的数据的~~
默认情况下,表里的数据都是可以重复的~~
现在,重新创建一个 带有unique约束的 student表:
首先,删除上次创建的 普通student表:
接着,创建一个带有unique约束的 student表:
此时,观察 student表 的结构,发现id只能是唯一值:
此时,向 student表里面 插入相同数据,会发现出错了(第一条插入没问题,第二条开始就出错了):
duplicate:重复~~
entry:条目~~
1.4 default约束
default约束,就是设定默认值~~
即 当我们插入数据的时候,如果不去指定,那么插入的时候就会自动去填写这个默认值~~
默认情况下的默认值,是null~~
可以通过 default约束 来修改默认的默认值~~
删除旧的 student表:
重新创建一张新的 student表(不加任何限制):
此时我们可以查看 student表 的结构:
当我们对表进行指定列插入的时候,就会涉及到默认值的情况的:
此时,我们只针对 id列进行插入,那么 剩下的 name列 就按照默认值来走的:
那么,我们可以通过 default约束 来修改默认值~~
重新删除 student表:
创建一张带有 default约束 的 student表:
此时,可以查看表的结构:
那么,此时可以插入数据来观察:
当然,只插入name的话,id就是默认值:
1.5 primary key 约束
primary key 约束,又叫做:主键约束~~
这是在设计表的时候,非常重要的一个列~~
主键表示一条记录的 "身份标识" ,用来区分 这条记录 和 其他的记录~~
主键的要求:
- 主键不能为空,相当于 not null
- 主键不能重复,相当于 unique
- 一个表里只能有一个主键
首先,删除 原来的 student表:
接着,创建一张带有主键的 student表(一般情况下 把 id 当作主键):
此时,可以查看 student表 的结构,会发现也出现了变化:
当插入数据的时候,
主键不允许为空值,同时主键必须唯一(这里的主键指的是 普通主键):
![]()
有的人可能会说:主键不能为空,而且必须是唯一的,
也就是说,主键必须填,而且还不能是重复的~~
那么以后填主键的时候,是不是还必须的要好好琢磨琢磨呢?
于是,MySQL为了方便大家填写主键,内置了一个功能 —— "自增主键" ,帮助我们自动生成主键的值,就不用程序员自己来保证了~~
从1开始,依次进行累加~~
自增主键 不是 普通主键,可以手动指定,也可自动生成~~
当我们填入一个具体值的时候,那就是手动指定;
当我们填入null的时候,那就是自动生成(按照自增规则)~~
首先,删除原来的 student表:
接着,创建一张新的 student表(内含 自增主键,自增主键 不是普通主键):
此时,查看 student表 的结构:
现在,插入一些数据:
自增规则:
MySQL要想自增,必须要能够记录下来当前 id已经到哪了~~
还要保证 自增 之后,得是不能重复的~~
MySQL里简单粗暴的做法,直接就是记录当前 自增主键 列里的最大值~~
这就能保证自增速度佷快。并且一定是不重复的~~
自增主键,主要就是用来生成一个唯一的 id,来保证不重复~~
如果数据库是分布式部署的~~
这个时候自增主键就要带来问题的~~
分布式,即 数据量太大,一台机器存不下,就需要使用多台机器来存~~
如果只有一个MySQL数据库服务器,那么 肯定自己是知道 当前 id的最大值,也就容易生成下一个唯一的 id~~
但是,如果是分布式部署,有多台机器,就可能有一个MySQL集群了:
每一个MySQL节点只知道自己节点上的最大值,不知道其他节点上的最大值~~
换句话说,每一个MySQL数据库可以生成一个在自己节点上唯一的 id,但是不能保证 自己生成的 id和其他的几个节点的 id是不是重复的~~
但是,生成唯一 id这样的需求,是客观存在的,但是MySQL自增主键,已经难以满足要求了~~
一个典型的解决方案是:在生成 id的时候,让这些节点相互协商一下&#x