【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。


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

相关推荐
time never ceases13 分钟前
Elasticsearch安装和数据迁移
大数据·数据库·elasticsearch·es
Just_Do_IT_OK1 小时前
Docker--MySql
mysql·docker·容器
程序员shen1616111 小时前
注意⚠️:矩阵系统源码开发/SaaS矩阵系统开源/抖音矩阵开发优势和方向
java·大数据·数据库·python·php
IvorySQL1 小时前
2024 开放原子开发者大会活动回顾|瀚高 IvorySQL 开源数据库在国产软件的开源实践
数据库·postgresql·开源数据库·国产数据库·ivorysql
庄周de蝴蝶1 小时前
一次 MySQL IF 函数的误用导致的生产小事故
后端·mysql
云计算DevOps-韩老师1 小时前
【网络云计算】2024第52周-每日【2024/12/26】小测-理论&实操-备份MySQL数据库并发送邮件-解析
linux·开发语言·网络·数据库·mysql·云计算·perl
2401_850410832 小时前
redis的持久化
数据库·redis·bootstrap
如雨随行20202 小时前
Mysql事务
数据库·mysql·oracle
阿维的博客日记3 小时前
MySQL并发问题区别-MVCC如何解决的
mysql·mvcc
未来并未来3 小时前
深入解析MVCC中Undo Log版本底层存储读取逻辑
java·数据库·mysql