六、MySQL数据库
关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
使用表存储数据,格式统一, 便于维护.
使用SQL语言操作,标准统一,使用方便,可用于复杂查询。
1、SQL语句
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。
通用语法:
SQL语句可以单行或多行书写,多行书写要用逗号结尾,最后以分号结尾。
SQL语句可以使用空格/缩进来增强语句的可读性。
MySQL数据库的SQL语句不区分大小写。
注释:
- 单行注释:–注释内容或#注释内容(MySQL特有)
- 多行注释::/* 注释内容*/
SQL语句通常分为四大类:
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
2、数据库设计-DDL
DDL英文全称是Data Definition Language,数据定义语言,用来定义数据库对象(数据库、表)。
2.1 数据库操作
上述语法中的database,也可以替换成schema。 如: create schema db01;
2.2 数据库图形化操作软件DataGrip是JetBrains
介绍::DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、 PostgreSQL的理想解决方案。
注意:idea里面已经集成的DataGrip的功能,因为idea也是JetBrains旗下的软件;
官网: https:/ /www.jetbrains.com/ zh-cn/ datagrip/
2.3 在idea中操作DataGrip的步骤:
1、在idea的右侧点击database。
2、点击Data Source,选择自己要创建的数据库类型。
3、第一次操作注意要下载对应驱动。
4、界面展示
2.4 表结构的操作
2.5 修改表结构
3、 DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
3.1 插入数据(insert)
1.插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
2.字符串和日期型数据应该包含在引号中。
3.插入的数据大小,应该在字段的规定范围内。
3.2 修改数据(update)
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
3.3 删除数据(delete)
DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DELETE语句不能删除某一个字 段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。
4、 DQL
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
4.1 DQL-基本查询
*号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)
4.2 DQL 条件查询
4.3 分组查询
聚合函数
注意:null不参与任意的统计函数
select count(*) from user; #统计user表单数据总数
#查询user表中的sex字段,对其进行分组,并统计各自的数量
select sex,count(*) from user group by sex;
having 函数后可以写聚合函数的条件
where与having区别:
1.执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
2.判断条件不同: where不 能对聚合函数进行判断,而having可以。
注意事项
1、分组之后, 查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
2、执行顺序: where >聚合函数> having。
4.4 排序查询
注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
4.5 分页查询
注意事项
- 起始索引从0开始,起始索引= (查询页码- 1) *每页显示记录数。
- 分页 查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第 一页数据,起始索引可以省略,直接简写为limit 10。
4.5 报表数据查询
5、多表设计
概念:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)、多对多、一对一
5.1 一对多关系
需求:根据页面原型及需求文档,完成部门及员工模块的表结构设计。(一个部门有多个员工,一个员工只属于一个部门)
直接在员工表中添加一个所属部门字段,记录部门表的ID。
5.1.1 多表链接-外键
多表问题分析:部门数据可以直接删除,然而还有部分员工归属于该部门下,此时就出现了数据的不完整、不一致问题(所属部门的员工还在)。目前上述的两张表,在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性的。
作用:当父表的数据要被删除时会检查子表中是否有父表对应外键字段的值,如果有就不能删除,必须将子表里面的关联父表字段的数据全部删除才能删除父表的字段。
#外键约束-语法
#创建表时指定
create table 表名(
字段名数据类型,
[constraint] [外键名称] foreign key (外键字段名) references 主表(字段名)
);
#建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名);
物理外键的缺点( 用 foreign key 添加的外键 ):
- 影响增、删、改的效率(需要检查外键关系)。
- 仅用于单节点数据库,不适用与分布式、集群场景。
- 容易引发数据库的死锁问题,消耗性能。
通常使用的都是逻辑外键:
在业务层逻辑中,解决外键关联。通过逻辑外键,就可以很方便的解决上述问题。
5.2 一对一关系
场景:用户与身份证信息的关系
关系::一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中, 其他字段放在另一张表中,以提升操作效率。
实现:在任意一方加入外键, 关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
5.3 多对多关系
场景:学生与课程的关系。
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择。实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
6、多表查询
多表查询:指从多张表中查询数据。
笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合和B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
6.1 多表查询分类
连接查询
内连接:相当于查询A表、B表交集部分数据
左外连接: 查询左表所有数据(包括两张表交集部分数据)
右外连接: 查询右表所有数据(包括两张表交集部分数据)
子查询:查询里面嵌套查询。
6.1 内连接查询
相当于查询A表、B表交集部分数据。
#隐式内连接查询
select tb_user.email,tb_links.email,tb_user.nick_name,tb_links.url_name from tb_user,tb_links where tb_user.email=tb_links.email;
#可以通过as或者直接给表取别名,取完别名后就只能用 别名.字段名来访问对应的字段
select tu.email,tl.email,tu.nick_name,tl.url_name from tb_user tu,tb_links tl where tu.email=tl.email;
#显式内连接查询
select tb_user.email,tb_links.email,tb_user.nick_name,tb_links.url_name from tb_user join tb_links on tb_user.email=tb_links.email;
6.2 外连接
左外连接: 查询左表所有数据(包括两张表交集部分数据)
右外连接: 查询右表所有数据(包括两张表交集部分数据)
#查询 tb_user表的全部数据,并且查询tb_links的email字段与tb_user表的emai字段值对应的数据
select tu.email,tu.nick_name,tl.email,tl.url_name from tb_user tu left join tb_links tl on tu.email=tl.email;
6.3 子查询
介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
形式:select * from t1 where column1 = ( select column1 from t2 … );
子查询外部的语句可以是insert / update / delete / select的任何一个,最常见的是select。
分类:
- 标量子查询:子查询返回的结果为单个值
- 列子查询:子查询返回的结果为一列,但可以多行
- 行子查询:子查询返回的结果为一行,但可以多列
- 表子查询:子查询返回的结果为多行多列
6.3.1 标量子查询
子查询返回的结果是单个值 (数字、字符串、日期等) ,最简单的形式
常用的操作符:= 、<> 、>、>= 、<、<=
6.3.2 列子查询
子查询返回的结果是一列(可以是多行)
常用的操作符: in、not in等
6.3.3 行子查询
子查询返回的结果是一行(可以是多列)。
常用的操作符:=、<>、in、not in
6.3.4 表子查询
子查询返回的结果是多行多列,常作为临时表
常用的操作符:in
7、多表查询案例
7、事务
定义:事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败(多条语句同时执行,要么一起成功,要么一起失败)。
场景:学工部整个部门门解散了,该部门及部门下的员工都需要删除了。如果删除部门成功了,而删除该部门的员工时失败了,就造成了数据的不一致。这时就要用到事务来解决。
注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句, MySQL会立即隐式的提交事务。
7.1 事务操作
开启事务:start transaction; 或 begin;
提交事务:commit; (将操作进行提交,只要事务没有提交,当前事务的数据是不会改变的,但是其它事务的数据已经发生了改变,只有当前事务的全部语句执行成功才执行它)
回滚事务:rollback; (如果失败,就将数据恢复到原样)
7.2 事务的四大特性(ACID)
- 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败。
- 一致性:事务完成时,必须使所有的数据都保持一致状态。
- 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
8、索引
定义:索引(index)是帮助数据库高效获取数据的数据结构。
无索引的查询方式:进行一条一条的全表扫描。
有索引的查询方式:通过树型结构来存储数据,就像通过目录来查询数据。
索引的优缺点:
- 优点:提高数据查询的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
- 缺点:索引会占用存储空间。索引大大提高了查询效率,同时却也降低了insert、update、delete的效率。
8.1 索引结构
MySQL数据库支持的索引结构有很多,如: Hash索引、 B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree结构组织的索引。
8.2 索引的语法
#创建:为tb_emp表的name字段创建一个索引
create index idx_emp_name on tb_emp(name);
#查询:查询tb_emp表的索引信息
show index from tb_emp;
#删除:删除tb_emp表的name字段的索引
drop index idx_emp_name on tb_emp;
注意事项:
- 主键字段,在建表时,会自动创建主键索引。
- 添加唯一约束时,数据库实际上会添加唯一索引。