MySQL
一、MySQL课程内容
Author:王国伟
Version:MySQL8.0
数据库介绍
- 数据库概念
- 术语介绍
MySQL数据库
- 下载、安装、配置、卸载
- MySQL客户端工具的安装及使用
SQL结构化查询语言
- 什么是SQL
- SQL操作数据(CRUD操作:添加、查询、修改、删除)
SQL高级
- 存储过程
- 索引
- 触发器、视图
数据库事务
- 什么是事务
- 事务特征ACID
- 事务隔离级别
- 事务管理
数据库设计
- 数据库设计步骤
- 数据库设计范式
- E-R图
数据库引擎
- MySQL体系结构
- 存储引擎介绍
- 常见引擎
- InnoDB逻辑存储结构
SQL优化
- 插入优化
- 排序优化
MySQL锁
- 全局锁
- 行级锁
- 表级锁
MySQL日志
- 错误日志
- 二进制日志
运维
- 主从复制
- 读写分离
二、数据库介绍
数据库的概念
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库软件还提供了高效的增加\删除\修改\查询数据的解决方案。
- 数据库,就是存放数据的仓库
- 数据库(DataBase,简称DB)是长期存储在计算机内部有结构的、大量的、共享的数据结合
- 长期存储:持久化
- 有结构:
- 类型:数据库不仅可以存放数据,而且存放的数据还是有类型的
- 关系:存储数据与数据之间的关系
- 大量:大多数数据库都是文件系统的,也就是说存储在数据库中的数据实际上就是存储在磁盘的文件中
- 共享:多个应用程序可以通过数据库实现数据的共享
为什么需要用数据库
其实通过io技术对数据进行增删改查,实际上相当于自己写了一个数据库软件,但功能简单,执行效率低下,而且每个项目都开发数据操作相关的代码致使开发效率低下,数据库就是当前计算机软件开发行业中,对大量数据管理的通用解决方案,学习数据库就是学习如何和数据库软件进行交流,SQL语言就是程序员和数据库软件进行沟通的语言。
关系型数据库与非关系型数据库
数据库可以分为
关系型和非关系型数据库:
关系型数据库
关系型数据库,采用关系模型来组织数据的存储,以行和列的形式存储数据并记录数据与数据之间的关系—–将数据存储在表格中,可以通过建立表格与表格之间的关联来维护数据与数据之间的关系。
学生信息—-学生表
班级信息—-班级表非关系型数据库
非关系型数据库,采用键值对的模型来存储数据,只完成数据的记录,不会记录数据与数据之间的关系。在非关系型数据库中基于其特定的存储结构来解决一些大数据应用的难题。
NoSQL(Not only SQL)数据库来指代非关系型数据库。
常见的数据库产品
关系型数据库产品
MySQL免费(最常用)
- MrriaDB
- Percona Server
PostgreSQL
Oracle(收费)(常用)
SQL Server
Access
Sybase
达梦数据库
非关系型数据库产品
- 面相检索的列式存储 Column-Oriented
- HaBsae(Hadoop子系统)
- BigTable(Google)
- 面相高并发的缓存存储Key-Value
- Redis
- MemcacheDB
- 面向海量数据访问文档存储Document-Oriented
- MongoDB
- CouchDB
数据库术语
数据库(Database):存储的数据的集合,提供数据存储的服务数据(Data):实际上指的是描述事务的符号记录数据库管理系统(DataBase Management System简称:DBMS):数据库管理系统,是位于用户与操作系统之间的一层数据管理软件数据库管理员(DataBase Anministrator简称:DBA):负责数据库创建,使用及维护的专门人员数据库系统(DataBase System简称:DBS):数据库系统管理员,数据库管理系统及数据库组成整个单元
三、MySQL数据库的环境准备
MySQL的下载、安装、配置、卸载、安装DBMS、使用DBMS
MySQL版本及下载
版本
MySQL是Oracle公司提供的免费的关系型数据库,官网http://www.mysql.com/
MySQL目前最新版本是
8.0.X,在企业项目中主流版本:5.0—5.5—5.6—5.7—8.0.X- 5.x — 常用版本为5.6或者5.7
- 8.x — 常用版本为8.0.x
MySQL 8.x的新特性
- 性能:官方8.x比5.7速度要快2倍
- 支持NoSQL(非关系型)存储:5.7开始提供了对NoSQL的支持,8.0.x做了更近一步的改进
- 窗口函数(提供了一种新的查询方式)
- 索引:隐藏索引、降序索引
- 可用性、可靠性
下载
MySQL安装
MySQL服务的启动与停止
MySQL是以服务的形式运行在系统中
计算机管理窗口
此电脑——>右键——>管理
Windows命令行
打开命令行:Win+R — 输入
cmd回车(如果上边步骤报错)以管理员身份打开命令行:
Win+S····输入cmd选择以管理员身份运行
1
2 net stop mysql ## 停止MySQL服务
net start MySQL ## 打开MySQL服务
MySQL的卸载
先关闭服务
1
2# 管理员身份启动cmd命令行
net stop mysql卸载软件
打开控制面板
点击”程序和功能”
找到MySQL右击卸载
删除目录
- MySQL的安装目录:
C:\Program Files\MySQL\MySQL Server 8.0,或者C:\Program Files(X86)\MySQL\MySQL(默认) - MySQL的数据文件目录(默认隐藏):
C:\ProgramData\MySQL(默认,如果不允许删除,强制删除)
- MySQL的安装目录:
删除注册表
- 打开注册表:
Win+R··· 输入regedit··· 回车 - 删除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MySQL(新版的MySQL卸载后会自动删除) - 删除搜索mysql的相关项(非必须)
- 打开注册表:
四、MySQL的管理工具
当完成数据库的安装之后,MySQL是以服务的形式运行在Windows/linux系统,用户是通过工具来对MySQL进行操作的,当我们安装完成MySQL之后默认安装了
mysql Command line client,此工具是一个命令行形式的工具,通常我们会单独安装可视化DBMS工具:
常用工具比如(以下都是收费的):
- SQLyog
- Navicat for MySQL
当然这里也有免费的DBMS工具,比如DBeaver
MySQL Command line Client使用
- 打开:开始菜单—MySQL— MySQL8.0 Command line client
- 连接MySQL:输入密码即可(如果密码错误或者mysql服务没有启动,窗口会闪退)
五、MySQL逻辑结构
MySQL可以存储数据,但是存储在MySQL中的数据需要按照特定的结构进行存储
学生——–学校
数据——–数据库
逻辑结构
六、SQL结构化查询语言
SQL概述
SQL(Structured Query Language)结构化查询语言,用于存取、查询、更新数据以及管理关系型数据库系统
SQL发展
SQL是1981年由IBM公司推出,一经推出基于其简洁的语法在数据库中得到了广泛的应用,成为主流数据库的通用规范
SQL由ANSI组织确定规范
在不同的数据库产品遵守SQL的通用规范,但是对SQL有一些不同的改进,形成了一些数据库的专有指令
MySQL:limit
SQLServer:top
Oracle:rownum
SQL分类
根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类:
DDL(Date Befinition Language)数据库定义语言
- 用于完成对数据库对象(数据库、数据表、视图、索引)的创建、删除、修改
DML(Data Manipulation Language)数据库操作/操纵语言
- 用于完成对数据库中的数据的添加、删除、修改操作
- 添加:将数据存储到数据表
- 删除:将数据从数据表移除
- 修改:对数据表中的数据进行修改
DQL(Date Query Language)数据查询语言
- 用于将数据表中的数据查询出来
DCL(Date Control Language)数据控制语言
- 用于完成事务管理等控制性操作
SQL基本语法
在MySQL Conmmand Line Client 或者 navicat等工具中都可以编写SQL指令
- SQl指令不区分大小写
- 每条SQL表达式结束之后都已
;结束 - SQL关键字之间以
空格进行分割 - SQL之间可以不限制换行(可以有空格的地方就可以有换行)
DDL 数据定义语言
DDL-数据库操作
使用DDL语句可以创建数据库、查询数据库、修改数据库、删除数据库
查询数据库
1 | ## 显示当前mysql中的数据库表 |
创建数据库
1 | ## 创建数据库 db_test表示创建的数据库名称,可以自定义 |
修改数据库 修改数据库字符集
1 | ## 修改数据库的字符集 |
删除数据库 删除数据库时会删除当前数据库中所有的数据表中的数据
1 | ## 删除数据库 |
使用/切换数据库
1 | use db_test; |
DDL-数据表操作
创建数据表
数据表实际上就是一个二维的表格,一个表格是由多列组成,表格中的每一类成之为表格的一个字段
在数据库中创建列名如果需要多个单词,请用
_来区分,因为SQL语句不区分大小写在小括号中定义列名,需要通过
,分割,切记最后一个没有逗号char(8):不可变字符串(定长,如果字符串长度不够,会自动补0)
varchar(20):可变字符串(一个字符占2个字节)
not null:约束不能为空
unique:约束不可重复
1 | create table students( |
查询全部数据表
1 | show tables; |
查询表结构
1 | desc students; |
删除数据表
1 | ## 删除数据表 |
修改数据表
修改表的关键词为alter
1 | ## 修改表名 |
MySQL数据类型
数据类型,指的是数据表中的列中支持存放的数据的类型
数值类型
在mysql中有多种数据类型可以存放数值,不同的类型存放的数值的范围或者形式是不同的
注意:前三种数字类型我们在实际研发中心用的很少,一般整数类型我们会直接使用int/integer,如果过大会使用bigint,同样浮点数类型默认会使用double
| 类型 | 内存空间大小 | 范围 | 说明 |
|---|---|---|---|
| tinyint | 1byte | 有符号 -128 - 127 无符号 0 - 255 |
特小型整数(年龄) |
| smalint | 2byte(16bit) | 有符号 -32768 - 32767 无符号 0 - 65535 |
小型整数 |
| mediumint | 3byte | 有符号 -2^31 - 2^31-1 无符号 0 - 2^32-1 |
中型整数 |
| int/integer | 4byte | 整数 | |
| bigint | 8byte | 大型整数 | |
| float | 4byte | 单精度 | |
| double | 8byte | 双精度 | |
| decimal | 一般情况:第一参数+2 | decimal(10,2) 表示数值一共有10位 小数位有2位 |
字符串类型
存储字符串列的类型
注意:在数据库中存储图片或者音频视频等内容,一般是存储,文件在服务器上的路径,当然如果非要存储就需要将图片等数据转成二进制进行存储,所以blob类型是可以存储所有类型的,但是前提是需要转换成二进制,所以此类型用的很少。
longtext类型一般用于varchar类型存储不下的时候。
常用类型也就是char和varchanr
| 类型 | 字符长度 | 说明 |
|---|---|---|
| char | 0-255字节 | 定长字符串,最多可以存储255个字符;当我们指定数据表字段为char(n),此列中的数据最长为n个字符,如果添加的数据小于n,则补’\u0000’至n长度 |
| varchar | 0-65536字节 | 可变字符串,此类型的最大长度为65535 |
| tinyblob | 0-255字节 | 存储二进制字符串 |
| blob | 0-65535 | 存储二进制字符串 |
| mediumblob | 0-1677215 | 存储二进制字符串 |
| longblob | 0-4294967295 | 存储二进制字符串 |
| tinytext | 0-255 | 文本数据(字符串) |
| text | 0-65535 | 文本数据(字符串) |
| mediumtext | 0-1677215 | 文本数据(字符串) |
| longtext | 0-4294967295 | 文本数据(字符串) |
日期类型
在MySQL数据库中,我们可以使用字符串在存储时间,但是如果我们需要基于时间字段进行查询操作(查询在某个时间段的数据)就不便于查询实现
| 类型 | 格式 | 说明 |
|---|---|---|
| date | 2021-09-13 | 日期,只存储年月日 |
| time | 18:26:36 | 时间,只存储时分秒 |
| year | 2024 | 年份 |
| datatime | 2024-04-14 18:26:59 | 日期+时间,存储年月日时分秒 |
| timestamp | 20240414182659 | 日期+时间,(时间锉) |
字段约束
约束介绍
在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表的列中的数据进行限制)
为什么要给表中的列添加约束呢?
- 保证数据的有效性
- 保证数据的完整性
- 保证数据的正确性
字段常见的约束有哪些呢?
- 非空约束(not null):限制此列的值必须提供,不能为null
- 唯一约束(unique):在表的多条数据,此列的值不能重复
- 主键约束(primary key):非空+唯一,能够唯一标识数据表中的一条数据
- 外键约束(foreign key):建立不同表之间的关联关系
非空约束
限制数据表中此列的值必须提供
- 创建表:设置图书表的 book_name not null
1 | create table books( |
唯一约束
在表中的多条数据,此列的值不能重复
- 创建表:设置图书表的book_isbn为unique
1 | create table books( |
添加数据
主键约束
主键——就是数据表中记录唯一标识,在一张表中只能有一个主键(主键可以是一个列,也可以是多个列的组合)
当一个字段声明为主键之后,添加数据时:
- 此字段数据不能为null
- 此字段不能重复
创建表时添加主键约束
1 | create table books( |
或者
1 | create table books( |
删除数据表主键约束
1 | alter table <表名> drop primary key; |
创建表之后添加主键约束
1 | ## 创建表时没有添加主键约束 |
主键自动增长
在我们创建一张数据表时,如果数据表中有列可以作为主键(例如:学生表的学号,图书表的isbn)我们可以直接这个列为主键;
当有些数据表中没有合适的列作为主键时,我们可以额外定义一个与记录本身无关的列(ID)作为主键,此列数据无具体的含义,主要用于标识一条记录,在mysql中我们可以将此列定义为int,同时设置为
自动增长,当我们向数据表中新增一条记录时,无需提供ID的列的值,它会自动生成。定义此列的原因,在于后期我们使用教程,对于数据进行CRUD的时候,可以根据此ID字段来完成一些操作。
定义主键自动增长
- 定义int类型字段自动增长:
auto_increment
1 | create table types( |
注意:自动增长从1开始,每添加一条记录,自动的增长的列会自定+1,当我们把某条记录删除之后再添加数据,自动增长的数据也不会重复生成(自动增长只保证唯一性、不保证连续性)
联合主键
如上的案例中,students为学员、courses为课程表、grads为分数表。此时成绩表中没有任何一列可以作为主 键的存在,因为不管是stu_num还是courses_id包括score都不能作为唯一表示的存在,所以此刻我们就需要使 用到联合主键,所以需要确定stu_num和course_id一并作为唯一标识
定义联合主键
1 | create table grades( |
注意:在实际企业项目的数据库设计中,联合主键使用的频率并不高;当一张表中没有明确的字段可以作为主键时,我们可以额外添加一个ID字段作为主键。
外键约束
在多分表关联部分会提到
DML数据操纵语言
用于完成对数据表中的数据的插入、删除、修改操作
1 | create table stus( |
插入数据
语法
1 | insert into <表名> (列名,列名....) valuse(值1,值2....); |
示例
1 | ## 向数据表中添加数据。完整格式 |
删除数据
语法
1 | delete from <表名> {where ...条件}; |
示例
1 | ## 删除学号为20240102的学生信息 |
修改数据
对数据表中已经添加的记录进行修改
语法
1 | update <表名> set 列名=值 {where ...条件} |
示例
1 | ## 将学号为20240105的学生姓名修改为“孙七”(只修改一列) |
DQL数据查询语言
从数据表中提取满足特定条件的记录
- 单表查询
- 多表联合查询
查询基础语法
1 | ## select 关键字后指定要显示查询到的记录的哪些列 |
where字句
在删除、修改及查询的语句后都可以添加where子句(条件),用于筛选满足特定的添加的数据进行删除、修改和查询操作。
1 | delete from 表名 where 条件; |
条件关系运算符
1 | ## = 等于 |
条件逻辑运算符
在where字句中,可以将多个条件通过逻辑预算(and or not)进行连接,通过多个条件来筛选要操作的数据。
1 | ##and 并且,筛选多个条件同时满足的记录 |
LIKE字句
在where字句的条件中,我们可以使用like关键字来实现模糊查询
语法
1 | select * from 表名 where 列名 like "reg"; |
- 在like关键字后的reg表达式中
%表示任意多个字符【%o%包含字母o】_表示任意一个字符【_o%第二个字母为o】
示例
1 | # 查询学生姓名包含字母o的学生信息 |
对查询结果的处理
设置查询的列
声明显示查询结果的指定列
1 | select 列名1,列名2,... from stus where stu_age > 20; |
计算列
对从数据表中查询的记录的列进行一定的运算之后显示出来
1 | ## 出生年份 = 当前年份 - 年龄 |
as字段取别名
1 | select stu_name,2021-stu_age as stu_birth_year from stus; |
distinct消除重复行
从查询的结果中将重复的记录删除
distinct
1 | select stu_age from stus; |
排序 - order by
将查询到的满足条件的记录按照指定的列的值
升序/降序排列
语法
1 | select * from 表名 where 条件 order by 列名 asc|desc; |
- order by 列名 表示将查询结果按照指定的列排序
- asc按照指定的列升序(默认)
- desc按照指定的列降序
实例
1 | # 单字段排序 |























