【MySQL】MySQL基础知识复习(下)

前言

上一篇博客介绍了MySQL的库操作,表操作以及CRUD。

【MySQL】MySQL基础知识复习(上)-CSDN博客

本篇将进一步介绍CRUD操作,尤其是查找操作

目录

一.数据库约束

1.约束类型

1.1NULL约束

1.2UNIQUE:唯一约束

1.3DEFAULT:默认值约束

[1.4PRIMARY KEY:主键约束](#1.4PRIMARY KEY:主键约束)

[1.5FOREIGN KEY:外键约束](#1.5FOREIGN KEY:外键约束)

二.进阶查询

1.聚合查询

[1.1 COUNT](#1.1 COUNT)

[1.2 SUM](#1.2 SUM)

[1.3 AVG](#1.3 AVG)

[1.4 MAX与MIN](#1.4 MAX与MIN)

[2.分组查询:GROUP BY](#2.分组查询:GROUP BY)

[2.1 having](#2.1 having)

3.联合查询(多表查询)

3.1内连接(笛卡尔积)

3.2外连接

3.3自连接

3.4合并查询



一.数据库约束

数据库的约束是对于数据库储存的数据,做出一些"限制"。

为什么会有对数据库的约束??

那是因为数据库中的数据非常重要,我们希望数据库中的数据不要存在一些"错误"的数据,为减少错误的可能性,减少因"人"而产生的失误,用程序进行限制会更为可靠。

数据库的约束就是对保存的数据进行合法性检查,一旦发现问题能够及时给出反馈。

1.约束类型

NOT NULL - 指示某列不能存储 NULL 值。

UNIQUE - 保证某列的每行必须有唯一的值。

DEFAULT - 规定没有给列赋值时的默认值。

PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性

1.1NULL约束

创建表时,如没有在类型后添加null约束,默认该类型可以为空,若是用not null约束,则该类型不能为null

如图:当not null限制时,添加null会报错

1.2UNIQUE:唯一约束

unique能确保该类型的数据不会有重复

如图,给id设定unique,若是后面设置的id与前面的重合,则会报错。

1.3DEFAULT:默认值约束

默认值默认为null,若是插入时选择某列插入,其他未选择的列则按照默认值插入。

如图,将name默认值设为无名,若在插入时未指定name,则默认未无名。

1.4PRIMARY KEY:主键约束

约定了这个表里的某个列为身份标识,是not null和unique的结合,一个表中只允许存在一个主键

MySQL提供了一个自动分配主键值的方式---"自增主键(auto_increment)"

在插入数据时可以不指定id的值,id会自动自增分配

1.5FOREIGN KEY:外键约束

外键约束需要有两个或两个以上的表时使用,当两个表相关联时,用一个表来约束另一个表的数据。

语法:

sql 复制代码
foreign key (字段名) references 主表(列) 

这种约束是双向的,删除时,如图先删除父表,则会报错。

删除时需先删除子表,再删除父表

二.进阶查询

1.聚合查询

针对行与行之间进行聚合查询

进行聚合查询,需搭配聚合函数

1.1 COUNT

count可查询数据的行数

如果有一行数据都是空,行数也会被count算进去,但如果只针对某个列,空值不会计入。

1.2 SUM

使用sum可以针对某一类的数据进行求和。

sum中也可以是表达式。

1.3 AVG

求某一列的平均值,要求列里是数字。

1.4 MAX与MIN

max为求某一列的最大值,min为求某一列的最小值。

2.分组查询:GROUP BY

使用group by指定一个列,就会把该列相等的行,归到一组里。

分完组后还可以针对每个组分别进行聚合查询。

例1:现有一张员工表

现在按职位进行分组,查询每个职业的人数

例2:求每个职业的平均工资

2.1 having

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING

例如:统计平均工资低于10000的职业

3.联合查询(多表查询)

3.1内连接(笛卡尔积)

笛卡尔积是将多个集合/表的数据按照一定规律进行排列组合。

例如:假设有一张学生表和班级表

对这两张表进行笛卡尔积,会得到以下结果:

这就是两张表笛卡尔积后的结果。

通过观察,我们发现有些数据符合情况,有些数据不符合实际结果。

因此,笛卡尔积后的数据,我们还需进一步筛选。

我们发现,两张表中都存在着"班级编号",当笛卡尔积后班级编号相同,则数据有意义,若不相同,则是无意义的数据。

例如:现有两张表student,class

对两张表进行笛卡尔积后得到:

未经过筛选,混杂着一些无意义的数据,通过where设置条件,进行判断后,排除无意义数据

此外,还可以通过join....on....来进行笛卡尔积

语法:

sql 复制代码
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;

笛卡尔积多表联合查询时会产生大量的中间数据,对性能影响较大,数据量大时可能会把数据库搞挂,因此使用笛卡尔积时要慎重。

3.2外连接

当两张表数据为一一对应关系时,内连接和外连接查询的数据结果完全一致

可当上述数据不再一一对应时,内连接和外连接就会出现差别。

例如:

student表与score表不再一一对应,内连接查询结果为

外连接是使用join....on写法的(不支持from多个表)

给join面前加上left/right就是(左/右)外连接

左外连接:以左表为基准,确保左表中每个记录出现在最终结果里,如果左表中的记录在右表没有对应的记录,此时就会把右表相关字段填成NULL。

例:

右外连接:以右表为基准,确保左表中每个记录出现在最终结果里,如果右表中的记录在左表没有对应的记录,此时就会把左表相关字段填成NULL。

例:

3.3自连接

自己与自己进行笛卡尔积

自连接本质上是将行关系转化为列关系。

注意,不能直接自己与自己笛卡尔积,而是要使用别名进行笛卡尔积

3.4合并查询

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

例1:针对同一个表进行union

例2:针对不同表进行union

注:union自带有去重操作,若想查看去重前的数据,则使用union all。


以上便是全部内容,如有不对,欢迎指正。

相关推荐
liuxin3344556637 分钟前
高效编程训练:Spring Boot系统设计与实践
数据库·spring boot·php
地图之家家长2 小时前
19.(开发工具篇mysql库)mysql锁表问题解决
数据库·mysql
秋意钟4 小时前
Java注解
数据库
看山还是山,看水还是。5 小时前
Oracle的字符串函数
运维·数据库·安全·oracle
东方巴黎~Sunsiny5 小时前
⚙️ 如何调整重试策略以适应不同的业务需求?
java·数据库·kafka
daopuyun5 小时前
全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程
网络·数据库·安全·安全测试
綦枫Maple6 小时前
Jmeter基础篇(23)TPS和QPS的异同
数据库·jmeter·oracle
川石课堂软件测试6 小时前
性能测试|JMeter接口与性能测试项目
javascript·数据库·python·jmeter·单元测试
oneslide6 小时前
达梦数据库迁移j脚本
数据库