MySQL数据库-基础篇
- 数据库
- 2023-01-21
卷心菜接下来将用N篇学习笔记记录MySQL相关知识,由浅入深、成体系;欢迎点赞关注!
本文是第一篇,内容主要来源于拉勾教育自动化测试训练营的2-2学习内容;
1 .数据库相关基础概念
1.1.什么是数据库?
1.数据库(DataBase) 就是存储和管理数据的仓库
2.本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上;
1.2.数据库的类型
关系型数据库(如MySQL、Oracle)非关系型数据库{也称NoSQL}(如Redis、MongoDB、HBase等)1.3.数据库管理系统
1.3.1.概念:
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理维护数据库的大型软件;
MySql就是一个 数据库管理系统软件, 安装了Mysql的电脑,我们叫它数据库服务器。
1.3.2.作用:
用于建立、使用和维护数据库,对数据库进行统一的管理;
1.3.3.数据库表的概念
数据库中以表为组织单位存储数据,表类似我们Java中的类,每个字段都有对应的数据类型; 使用熟悉的Java程序来与关系型数据对比,发现以下关系:
1.3.4.数据库管理系统、数据库、表之间的关系
MySQL中管理着很多数据库,在实际开发环境中 一个数据库一般对应一个应用,数据库中保存着多张表,每一张表对应着不同的业务,表中保存着对应业务的数据;
1.4.结构化查询语言的概念
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
1.4.1.SQL的作用:
是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL所有的关系型数据库都可以使用SQL不同数据库之间的SQL 有一些区别(类似方言)1.4.2.SQL的通用语法
1)可以单行 或者 多行书写,以分号 结尾 ; 2)可以使用空格和缩进来增加语句的可读性; 3) MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名 列名 →小写; 4) 注释方式 ①单行注释:-- 空格(MySQL可以用 #)②多行注释:/**/
1.4.3.SQL的分类
数据定义语言:DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等;
数据控制语言:DCL(Daat Control Language),用来定义数据库的访问权限、安全级别、创建用户。(了解)
数据操作语言:DML(Data Manipulation Language),用来对数据库中表的记录进行更新;
数据查询语言:DQL(Data Query Language),用来查询数据库中表的记录;
需要重点掌握DML、DQL;
1.5.MySQL基础操作指令
1.5. 1.对数据库的操作(DDL)
创建数据库:
修改数据库:
查询数据库:
删除数据库:
1.5.2 对数据库表的操作(DDL)
创建数据库表的语法
查看表
修改表
约束
约束指插入数据时,应该遵循的规则,就叫做约束。
1.5.3. 操作数据表的数据(DML)
插入数据
修改数据
删除数据
1.5.4 查询单表中数据(DQL)
简单查询
去重关键字distinct
条件查询
排序
分组
分组过滤
limit
子查询
from 中使用子查询
where中使用子查询
交叉连接(笛卡儿积)
内连接
左连接
右连接
聚合函数
1.5.5. 查询语句运行顺序
1.6.MySQL事务
事务是一组操作序列,要么全部成功,要么全部失败
1.6.1 事务的四个特性(ACID)
原子性(Atomicity)事务包含的所有操作要么全部成功,要么全部失败回滚;
一致性(Consistency)一个事务执行之前和执行之后都必须处于一致性状态;
隔离性(Isolation)多用户并发访问数据库时,比如操作同一个数据表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离;
持久性(Durability)一个事务一旦提交成功了,那么对数据库中的数据的改变是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作;
1.6.2 分布式操作带来的问题
分布式操作数据库时,会导致事务出现脏读、幻读、不可重复读的问题;
脏读:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
幻读:
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
不可重复读:
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
三者区别: 脏读:在一个事务中,两次读取同一行记录,得到的数据不一样 幻读:在一个事务中,两次读取同一个表,得到的数据记录数不一样
不可重复读:在一个事务中,两次读同一个数据时,得到的数据不一样
1.6.3 数据库事务隔离级别
数据库事务隔离级别是用来解决上述分布式操作带来的3个问题;隔离级别从低到高有如下4种:
读未提交查询没加锁,可能会产生“脏读”、“不可重复读”、“幻读”问题,所以基本不使用;
读已提交常用的一种隔离级别(Oracle/SQL Server);这种隔离级别可以有效的避免脏读,但查询种没加锁;
除非在查询中显示的加锁,如:
select * from t_user where user_id =8 lock in share mode;
select * from t_user where user_id=8 for update;
否则,普通的查询是不会加锁的。
那为什么“读提交”同“读未提交”一样,都没有查询加锁,但是却能够避免脏读呢?
这是因为另一个机制“快照”,这种既能保证一致性又不加锁的读也被称为“快照读”;
若没有“快照读”,那么当一个待更新的事务没有提交时,另一个对更新数据进行查询的事务会因为无法查询而被阻塞,这种情况下,并发能力就很差。而“快照读”就可以完成高并发的查询,不过,“读提交”只能避免“脏读”,并不能避免“不可重复读”和“幻读”;
可重复读是MySQL的默认隔离级别;普通查询同样是使用的“快照读”;
与上一个“读已提交”不同的是,当事务启动时,就不允许执行“修改操作(Update)”了,而“不可重复读”恰恰是因为两次读取之间进行了数据的修改,因此,可以有效的避免“不可重复读”,但却避免不了“幻读”,因为幻读是由于“插入或者删除操作(Insert or Delete)”产生的;
串行化事务串行化挨个顺序执行,“脏读”、“不可重复读”、“幻读”都可以被避免,但是执行效率很低,性能开销也大,所以基本不用;
1.7数据库设计思想
1.7.1 三范式(最省空间)
1 NF :设计出来的表中,列是不可以继续拆分的;
数据表中每个字段都是不可再分的最小数据单元,则满足第一范式;
2 NF: 每列都和主键有关系,一张表只描述一件事;
3 NF :列之间不存在依赖关系;(消除传递依赖 )
1.7.2 反三范式
冗余设计,提升性能;比如宽表;
当需要查询“订单表”所有数据并且只需要“用户表”的name字段时, 没有冗余字段 就需要去join 连接用户 表,假设表中数据量非常的大, 那么会这次连接查询就会非常大的消耗系统的性能. 这时候冗余的字段就可以派上用场了, 有冗余字段我们查一张表就可以了;
索引、多表查询等其他内容 将在下一篇笔记更新;欢迎点赞关注!