![](https://img-blog.csdnimg.cn/9a320acef4874786ae72f8abb4533d54.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-N5YaF56CB6ICF,size_14,color_FFFFFF,t_70,g_se,x_16)
本节内容主要为增删查改的进阶内容,
后续内容,敬请期待~~~
1. 数据库约束
约束就是数据库在使用的时候,对于里面能够存储的数据提出的要求和限制,程序员就可以借助约束来完成更好的校验
**1.1 约束类型 **
这里主要给大家介绍5种约束:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
1.2 NULL约束
①原理:(列名 类型 not null)
创建表时,可以指定某列不为空
②演示:(可以同时对多个列进行指定)
a.对单个列进行约束时
b.对多个列进行约束时
1.3UNIQUE:唯一约束
①原理:(列名 类型 unique)
保证每一列有唯一的数据,使用后若在相同位置插入相同的数据,即会产生报错提醒;
②演示:
**1.4 DEFAULT:默认值约束 **
①原理:(列名 类型 default 默认值)
规定没有给列赋值时为默认值
②演示:
1.5 PRIMARY KEY:主键约束
①原理:(列名 类型 primary key)
not null 和 unique的结合。确保某列(或某两列,某多个列有唯一的标识,这样有助于更快速地找到表中的一个特定的记录。主键约束,相当于数据的唯一身份标识,类似于身份证号码、手机号码
②演示:(注意!一个表中只能有一个列被指定为主键)
a.具有not null性质的体现
b.unique性质的体现
** ③自增主键:**
对于主键而言,典型的用法,就是直接使用1,2,3,4整数递增的方式来进行表示,MySQL里面对于这种递增的主键,是有内置支持的,称为“自增主键”。
a.用法 :(列名 类型 primary key auto_increment)
注意!!!若没有指定从某数开始递增的话,那么默认从1,开始递增。若是给了指定数,那么则从指定数开始递增
(1)从默认值1开始递增的情况:
(2)从指定值开始递增的情况:
1.6 FOREIGN KEY:外键约束
①原理:(格式参照演示示例)
是对两张表进行关联
a.外键约束,描述的是两张表的两个列之间的“依赖关系”
b.子表依赖于父表,要求子表中对应的记录得在父表中存在
c.而所谓的这种存在,不一定是一对一的,只要存在那么则满足了要求②演示:
(1)外键对子表的约束
a.若插入值所对应的相关联的列中该值存在,那么插入成功,反之,插入失败
b.并不是一一对应关系,只要在父表待查列中存在的值,插入时是可以重复的
c.不仅是新增要考虑数据的约束,同时修改值的时候同样要考虑
(2)外键对于父表的约束
a.当尝试删除关联列的父表的值时
** ③外键约束的工作原理:**
a.在子表中插入新的记录的时候,就会根据对应的值,在父表中先查询,查询到之后,才能进入后续的插入
b.这里的查询操作,可能是一个成本较高的操作(费时间),外键约束其实要求,父表中被依赖的这一列,必须有索引,有了索引后就能大大的提高查询速度
c.class表中的classId这一列,得是primary key 或者unique(有了这俩约束的列,就会自动地创建出索引了)
2. 表的设计
所谓表的设计,其实实质上就是根据实际的问题场景,把表给创建出来了。
对于一个问题场景而言,我们该如何设计数据库,如何设计表?
一个典型的通用的办法就是:先找出这个场景中涉及到的“实体”(即对象),然后进一步分析“实体间的关系”我们下面进行分析的三种对应关系,以以下为基础来进行建立
2.1 一对一
①解释:
以一个学习的系统为例。
我们很容易知道:一个账户对应一个学生,同时,一个学生对应一个账户
而在数据库中如何表示这种一对一的关联关系呢?
方法一:可以将两个实体,用一张表来进行表示
方法二:用两张表来表示,然后用唯一外键约束对id进行约束,根据这个对应关系,就能够找到是哪个学生对应哪个账户,或者说哪个账户对应哪个学生
2.2一对多
①解释:
仍然以教务系统为例:
我们很容易知道,一个学生只能在一个班级中存在,而一个班级却可以对应多个学生,这里就体现了一对多
而在数据库中如何表示这种一对多的关联关系呢?
方法一:
学生表不变,在班级表中新增一列id,用来表示这个班级里的学生id信息
但是!!!在MySQL中并没有提供类似于数组这样的类型,像Redis这种数据库才有提供这种类型,所以这里不支持使用,应该使用方法二来进行解决
方法二:
班级表不变,在学生表中新增一列classId,用来表示这个学生所在的班级
因此对于一对多的这种情况,应该采取方案二来进行
2.3多对多
①解释:
仍以教务系统为例:
我们很容易知道,一门课对应了多名同学,与此同时,一名同学可以选择多门课,因此这就是所谓的多对多的关系
而在数据库中如何表示这种多对多的关联关系呢?
我们可以使用一个关联表来表示这种多对多的关系
3.新增
这里的新增操作指的是和查询相结合的新增
比如:将上一个表的查询内容插入到下一个表中
①当变量顺序是对应关系的时候的情况:
** ②当变量不是顺序对应会发生什么情况呢?**
会插入失败,但我们可以对指定的列进行插入,那么,就可以插入成功
由此就能够插入成功
4.查询
4.1 聚合查询
是指把多行之间的数据进行聚合的行为
4.1.1 聚合函数
在MySQL中常有一些内置的聚合函数,在这里我们是可以来直接进行使用的
①相关函数的格式:
函数****说明COUNT([DISTINCT] expr)返回查询到的数据的数量SUM([DISTINCT] expr)返回查询到的数据的总和,不是数字没有意义AVG([DISTINCT] expr)返回查询到的数据的平均值,不是数字没有意义MAX([DISTINCT] expr)返回查询到的数据的最大值,不是数字没有意义MIN([DISTINCT] expr)返回查询到的数据的最小值,不是数字没有意义
②具体用法演示:(这里只演示两个作为代表,其余用法类似)a.count(*)即是用来计算总行数(注意在count括号中也可以指定为某列,效果是一样的)
当指定为count(id)后的演示结果
b.sum()来对指定的行来进行求和,注意如果是字符串的话,则不能用来求和
字符串是不能用来求和的
也可以搭配表达式和where进行使用
**4.1.2 GROUP BY子句 **
根据行的值,对数据进行分组的操作,把值相同的行都归为一组
a.用group by进行分组并结合聚合函数的情况
b.在a的基础上进行更名的操作
4.1.3HAVING
①用法:
是在已经执行了分组条件后对分组进行条件筛选
②区别于where:
a.where是指在分组前对分组条件进行的筛选:
(注意!!!where+条件是放于group by role的前面)
b.having是指在分组后的筛选:
(注意!!!having +条件是放在group by role 后面)
**4.2 联合查询 **
①什么是联合查询???
所谓联合查询就是指把多个表的记录联合在一起进行查询的过程,也被称为多表查询
②联合查询的核心操作是什么?
笛卡尔积!!!
③什么是笛卡尔积???
类似于排列组合来把表进行组合计算
④如何在SQL中进行笛卡尔积
最简单的做法就是直接select * from 后面跟多个表名,表名间用逗号进行分隔
对于上面的操作,有一些数据是没有意义的,我们可以通过对classId作为关联条件,来指定有意义的数据的存在
(对于某个表的某项属性的引用,用.来连接,类似于java中的操作)
** ⑤多表查询**
一、单纯用from +表名+表名......来实现多表查询
a.当前构造的数据
b.展示关于多表查询的具体操作:(这里就只举2个例子)
(1)查询许仙同学的成绩
分析问题要思考,数据究竟来源于哪个表
①利用笛卡尔将学生表与分数表结合起来
(共有160行。这里部分截取)
②找寻有效数据,则id相同的数据为有效数据
③过滤其它同学信息,找许仙同学的信息
④简洁储存,只含名字和成绩
大家刚开始接触的时候,一步一步来,不要想着一步登天,不然会大大降低正确率
二、用join on 来实现多表查询的操作
相比之下,from表名,表名where的用法形式,更加简洁,但是join除此之外还有其他的用法,会在下面外连接部分讲到
4.2.1 内连接
①内连接的两种写法及图法解析:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
②内连接的实际含义:
内连接实际上是指双方某列或者某几列对应连接时,均满足的有效值的表的呈现 下面给大家举个例子: 可以看出这两个表的classid列是可以进行连接而student表中对应的classid在class表中是完全对应的,因此,无需指定,这两个表的联合表本身就是一个内连接的体现
下面我们进行连接来看结果,可以看到这四个同学均在这件内连接后的表上 a.直接用from 进行内连接
b.用inner join on来进行内连接
不知道通过以上讲解,你是否明白内连接的含义了呢???
**4.2.2 外连接 **
①什么是外连接:
根据上面一点对内连接的理解的基础上,我们再来举一个例子
因为李媛所在的班级id并不在其关联列中存在,所以当我们采用内连接时,就无法查看李媛同学和她的相关信息
查看结果:
然而我们又想知道她的信息,这个时候我们就需要用到外连接
②左外连接:
而像李媛这种在左侧表中存在而不在右侧表中存在,我们称为“左外连接”。
我们可以通过left join on来获取李媛的相关信息
**③右外连接: **
理解了左外连接,那么我们自然知道右外连接针对的是另一个表某关联列中的某个数据不存在于第一个表中,我们也来举个例子帮助理解
我们可以看到,class表中classid=5这个数据并没有在student1中这个表体现,这个时候,我们要是想要在联合表中看到,就要right join on使用右外连接
右外连接后的结果:
4.2.3自连接
①什么是自连接:
自连接就是把自己和自己进行笛卡尔积的过程
②为什么要使用自连接:
自连接用的不多,多用于将行转化成列,从而更容易进行先关比较
③举个例子帮助理解一下:
题目:显示计算机成绩>Java成绩的信息
右图我们可以看出这个成绩是按照行来排列的,如果我们想要比较就会显得很困难,因此我们把它转换成列的方式就叫做自连接
当我们转换成列后,我们就可以很清楚地看到了
4.2.4子查询
什么是子查询?
就是将分好的代码,进行套娃到一个代码中的操作,实际操作是不常用的,此处只是简单提及一下
(此处只是两个sql和在一起的操作,当多个和在一起时,只会给我们带来负担)
4.2.5合并查询
①什么是合并查询???
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。
②union与union all 有什么区别
union:当使用该操作符时,会自动去掉结果集中的重复行
union all:当使用该操作符时,不会去掉结果集中的重复行
③演示:
查询id<3或者名为张三的学生 我们可以发现有两个重复的值,我们用其来看union 和union all的区别
a.用union
b.用union all
由此可以看出union是具有去重功能的
b.用or
感谢观看~~~
![](https://img-blog.csdnimg.cn/8fe82eba6bf2465c82899ed056228d2e.png)
版权归原作者 反内码者 所有, 如有侵权,请联系我们删除。