前言
上一篇博客介绍了MySQL的库操作,表操作以及CRUD。
本篇将进一步介绍CRUD操作,尤其是查找操作
目录
[1.4PRIMARY KEY:主键约束](#1.4PRIMARY KEY:主键约束)
[1.5FOREIGN KEY:外键约束](#1.5FOREIGN KEY:外键约束)
[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)
一.数据库约束
数据库的约束是对于数据库储存的数据,做出一些"限制"。
为什么会有对数据库的约束??
那是因为数据库中的数据非常重要,我们希望数据库中的数据不要存在一些"错误"的数据,为减少错误的可能性,减少因"人"而产生的失误,用程序进行限制会更为可靠。
数据库的约束就是对保存的数据进行合法性检查,一旦发现问题能够及时给出反馈。
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。
以上便是全部内容,如有不对,欢迎指正。