Egoistic_Flowers

MySQL基础
MySQL基础

1 数据库

业务级MySQL:事务 索引...

运维级MySQL:底层,架构原理,MySQL集群,负载均衡...

1.1 什么是数据库

数据库(DB ,DataBase)

作用:储存数据,管理数据

DBMS:数据库管理系统

  • 数据库的管理软件

1.2 数据库分类

关系型数据库:(SQL)

  • MySQL, Oracle, Sql Server, DB2, SQLite
  • 通过表和表之间,列和列之间的关系数据进行存储

非关系型数据库:(NoSQL Not Only SQL)

  • Redis, MongDB
  • 以对象存储,通过对象的属性来决定

1.3 MySQL简介

  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于 Oracle旗下产品
  • 体积小、速度快、总体拥有成本低
  • MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一

2 操作数据库

2.1 数据库基本操作

创建数据库

IF NOT EXISTS 不存在时创建

删除数据库

IF EXISTS存在时删除

使用数据库

当数据库中的字段名是关键字时需要加``括起来

查看数据库

查看所有数据库

2.2 数据库的数据类型

数据库的列的数据类型

数值

  • tinyint 1个字节
  • smallint 2个字节
  • mediumint 3个字节
  • int 4个字节
  • bigint 8个字节
  • float 4个字节
  • double 8个字节
  • decimal 字符串类型的浮点

注:int类型的长度不是保存数据的长度,就算定义int(1)还是能存储到2^32,int(n),长度n表示最大显示宽度,显示宽度与存储大小无关,与zerofull的填充长度有关(与vaechar不同)

在INT(3)的情况下插入100,10,0,结果为:100,010,001

字符串

  • char 字符串固定大小 0~255
  • varchar 可变字符串 0~65535 String
  • tinytext 微型文本 2^8-1
  • text 文本串 2^16-1

时间和日期

  • date YYYY-MM-DD 日期格式
  • time HH:mm:ss 时间格式
  • datetime YYYY-MM-DD HH:mm:ss 时间
  • timestamp 时间戳 1970.1.1到现在的毫秒 全球统一
  • year 年份

null

  • 没有值
  • 不要使用null进行运算

2.3 数据库的字段属性

数据库的列所携带的属性

Unsigned

  • 无符号整型
  • 声明后该列不能为负数

zerofill

  • 0填充的
  • 不足的位数用0来填充
  • 定义int(3), value = 5 ,005

自增

  • 自动在上一条记录基础上加1
  • 通常用来设计唯一的主键,必须为整数类型
  • 可以自定义主键自增的起始值和步长

非空 NULL not null

  • 设置为非空不赋值就会报错

默认值 default

  • 设置默认的值

在项目中推荐必须携带的字段

2.4 创建数据库表

DDL 数据定义语言

creat

格式:

2.5 数据库引擎

 MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大 2倍

常规使用操作:

  • MYISAM 节约空间,速度快
  • INNODB 安全性高,事务处理,多表多用户操作

存储:本质文件存储

设置数据库表的字符集编码

MySQL的默认的编码设置为Latin1,不支持中文

  1. 在创表的时候修改编码
  1. 在my.ini中配置默认的编码

建议每次建表都加上编码,修改本地配置会与其他的服务端配置不同步,可能导致同样的建表不同的效果

2.6 修改和删除表

修改

删除

所有的删除操作尽量加上判断

2.7 外键

未命名文件

外键的作用相当于约束,在表1中grade数据必须和表2存在的id数据匹配,否则无法提交修改

1 在创建表的时候添加外键

创建年级表

创建学生表

查看表可以看到外键

image-20211121214703715

存在被引用关系的表不能直接删除 需要先删除引用表

直接在建表时添加外键容易出现依赖性问题,版本兼容性差,可以使用ALTER语句进行添加约束

2 ALTER添加外键

以上为数据库级别的外键,不建议使用,数据库表多之后引用复杂兼容性差

推荐使用:在程序中实现外键

3 DML 数据操纵语言

DML语言:数据操作语言

  • insert 添加
  • update 更新
  • delete 删除

3.1 添加

INSERT 语句

基本插入:

多行插入:

插入结果:

image-20211121222144492

3.2 修改

UPDATE 语句

WHERE 子句

where 是筛选的条件

操作符含义语句结果
=等于id=6操作第6行
<>或!=不等于id<>6操作除了第6行
>大于id>6操作7~infinite行
<小于id<6操作1~5行
>=大于等于id>=6操作6~infinite行
<=小于等于id<=6操作1~6行
BETWEEN...AND...在...之间id BETWEEN 2 AND 6操作2~6行
ANDid<=6 AND id>=2操作2~6行
ORname='小明' or name='张三'操作名字是小明和张三的行
NOTNOT id = 6操作除了第6行

3.3 删除

DELETE 语句

TRUNCATE 语句

作用:完全清空一个数据库表,表结构,索引不改变

DELETE 和 TRUNCATE 的区别

  • 相同点:都能删除数据,不会改变表结构

  • 不同:

    • TRUNCATE 会重新设置自增列的计数器
    • TRUNCATE 不会影响事务

DELETE删除问题:

重启数据库之后:

  • InnoDB 自增从1开始(数据存储在内存)
  • MyISAM 继续上一个自增量 (数据存储在文件,后备存储)

4 DQL 数据查询语言

DQL 数据查询语言

  • 所有的查询操作都使用
  • 简单查询,复杂查询都能完成
  • 数据库最核心的语言,使用频率最高的语言

4.1 基本查询及别名使用

SELECT 语句

SELECT语法

 

image-20211123201553040

image-20211123201939182

4.2 去重查询

DISTINCT 关键字

去除SELECT查询出的重复数据

4.3 WHERE 条件

检索数据库中符合条件的行

跳转到之前WHERE 的用法

简单使用:

4.4 模糊查询

LIKE 运算符

SQL匹配,如果a 匹配 b 结果为真

  • %代表有任意个字符
  • _代表一个字符

IN 运算符

IS NULL 和 IS NOT NULL

条件:是否为空

4.5 联表查询

JOIN ON

七种JOIN:

INNER JOIN :

image-20211123231145317

RIGHT JOIN:

image-20211123231237702

LEFT JOIN :

image-20211123231302574

操作描述
INNER JOIN只返回两个表中联结字段相等的行
RIGHT JOIN返回包括右表中的所有记录和左表中联结字段相等的记录
LEFT JOIN返回包括左表中的所有记录和右表中联结字段相等的记录

简单理解:

  • INNER JOIN:

    • 返回的值是两张表中都有的
    • 例如:a表中有key = 1,2,3 b表中只有key = 1,2 ,此时结果只会返回key = 1,2;
  • RIGHT JOIN

    • 返回的值是两张表中都有的与b(右)表中所有的
    • 例如:a表中有key = 1,2,4 b表中有key = 1,2,3 ,此时会返回key = 1,2,3;
  • LEFT JOIN

    • 返回的值是两张表中都有的与a(右)表中所有的
    • 例如:a表中有key = 1,2,3,4 b表中有key = 1,2,3,5 ,此时会返回key = 1,2,3,4;
  • RIGHT JOIN和LEFT JOIN 的返回值可能会存在a或b表中没有的数据,返回的表就会把这些字段的值设为NULL

通过这个返回值为NULL的情况又可以衍生出几种JOIN的模式如上图

应用:

三张表联表查询:

找到每张表中共同存在的字段就可以关联

4.6 自连接

相当于一张表自己跟自己进行联表查询

现有一张表:

image-20211124154002143

这里PID是父类的ID,PID为1就是父栏位,子栏位的PID等于父栏位categoryid

查询结果如下

image-20211124154213858

本章需要先理解联表查询

4.7 分页与排序

ORDER BY 排序

LIMIT 分页

4.8 子查询(嵌套查询)

在WHERE语句中嵌套一个子查询语句

image-20211124163215858

4.9 分组查询 (过滤)

GROUP BY 分组查询

查询结果:

image-20211124174423081

HAVING 分组过滤

查询结果:

image-20211124174653596

5 MySQL函数

所有函数

5.1 常用函数

5.2 聚合函数

函数名称描述
COUNT()计数
SUM()求和
AVG()平均值
MAX()最大值
MIN()最小值

5.3 数据库级MD5加密

MD5不可逆,但是相同的值加密后加密值相同

6 事务

6.1 什么是事务

事务原则:ACID原则:原子性,一致性,隔离性,持久性(脏读,幻读...)

  • 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

    • 事务的几个步骤,要不一起成功要不一起失败
  • 一致性:事务前后数据的完整性必须保持一致

    • 事务完成后,符合逻辑运算
  • 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

    • 事务没有提交,恢复到原状,事务已经提交,持久化到数据库
  • 隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

    • 针对多个用户同时操作,排除其他事务对本事务的影响

事务的隔离级别

脏读:一个事务读取了另一个事务的未提交数据

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同

幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致

6.2 开启事务

DCL 数据控制语言

事务处理流程:

未命名文件(1)

 

模拟事务执行:

7 索引

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构

7.1 索引的分类

  • 主键索引

    • 唯一标识,主键不可重复,只能有一个列为主键
  • 唯一索引

    • 避免重复的列出现,多个列可以标识为唯一索引
  • 常规索引

    • 默认,用key关键字设置
  • 全文索引

    • 在特定数据库引擎下支持

7.2 测试索引

7.3 索引原则

  • 经常变动的数据不要加索引
  • 小数据量不需要加索引
  • 索引一般加在常用字段

索引的数据结构

  • Hash: 哈希
  • Btree :b树(InnoDB默认的数据结构)

8 权限管理和备份

8.1 用户管理

SQLyog可视化管理

image-20211125215623891

image-20211125215852257

权限管理:

image-20211125215912693

创建表,更新表,删除表,插入,更新,删除...

8.2 数据库备份

  • 保证重要数据不丢失
  • 数据转移

MySQL备份方式

  • 1.拷贝物理文件
  • 2.用可视化工具导出

image-20211125222618227

  • 3.使用命令行导出 mysqldump

导入:

image-20211125224939827

9 数据库设计规范

当数据库复杂时需要设计

数据库设计要求:

  • 节省内存空间
  • 保证数据完整性
  • 方便开发系统

数据库设计问题:

  • 数据冗余,浪费空间
  • 数据插入和删除麻烦,异常[不使用物理外键]

关于数据库设计

  • 收集信息,分析需求

    • 用户表(用户登录注销,用户个人信息,写博客...)
    • 分类表(文章分类)
    • 文章表
    • 自定义表(系统信息,关键字,主题...)
  • 标识实体(把需求落地到字段)

9.1 三大范式

为什么需要规范化

  • 信息重复
  • 更新异常
  • 插入异常
  • 删除异常

三大范式

1.第一范式(1NF):列不可再分

  • 1.每一列属性都是不可再分的属性值,确保每一列的原子性
  • 2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

2.第二范式(2NF):属性完全依赖于主键

前提:满足第一范式

  • 一行数据只做一件事情
  • 例:一个人订了多个房间,此时每行还包含了联系人的信息和房间号,为了记录此人的多个房间号,创建多行此联系人的数据就会导致(联系人信息)数据冗余,需要把联系人信息和联系人订的房间号拆开两张表存放

3.第三范式(3NF):属性不依赖于其它非主属性 属性直接依赖于主键

前提:满足第二范式

  • 每列数据都需要直接和主键相关
  • 例:学生表里每个学生都存储了班主任的信息,此时应该把班主任的信息拆开成班主任表,学生表只保留班主任姓名(id)用于关联两张表

规范性 和 性能的问题

关联查询不得超过三张表

  • 考虑商业化需求,数据库的设计性能更重要
  • 在性能允许情况下尽量规范
  • 故意增加冗余字段(减少表数量)
  • 故意增加计算列(索引)

posted on 2021-11-20 21:13  Egoistic_Flowers  阅读(41)  评论(0编辑  收藏  举报