【自用】MySQL学习笔记
基础:MySQL概述、SQL、函数、约束、多表查询、事务
进阶:存储引擎、索引、SQL优化、视图 / 存储过程 / 触发器、锁、InnoDB核心、MySQL管理
运维:日志、主从复制、分库分表、读写分离
(指令中的[]表示可选部分。大小写都可以。)
相关概念
Database, DB(数据库) | 存储数据的仓库,数据是有组织地进行存储的 |
---|---|
Database Management System, DBMS(数据库管理系统) | 操纵和管理数据库的大型软件 |
Structured Query Language(SQL) | 操作关系型数据库的编程语言,定义了一套操作相关型数据库统一标准 |
启动、停止、连接
(假设安装时注册到windows系统服务的服务名称为mysql80。)
启动:终端输入
1 | net start mysql80 |
停止:终端输入
1 | net stop mysql80 |
客户端连接:
- 方式一:MySQL提供的客户端命令行工具:MySQL 8.0 Command Line Client。然后输入密码。
- 系统自带的命令行输入(需配置Path环境变量):
1
mysql [-h 127.0.0.1] [-p 3306] -u -root -p
数据库类型
关系型数据库(RDBMS)
建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
- 使用表存储数据,格式统一,便于维护。
- 使用SQL语言操作,标准统一,使用方便。
非关系型数据库
MySQL数据模型
MySQL图形化界面
- Sqlyog
- Navicat
- DataGrip
SQL语法
SQL通用语法、SQL分类、DDL、DML、DQL、DCL
通用语法
- SQL语句可单行或多行书写,以分号结尾。
- SQL语句可使用空格 / 缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释:
单行注释:– 或 #(MySQL特有)
多行注释:/* */
SQL分类
Data Definition Language, DDL | 数据定义语言,定义数据库对象(数据库、表、字段) |
---|---|
Data Manipulation Language, DML | 数据操作语言,对数据库表中的数据进行增删改 |
Data Query Language | 数据查询语言,查询数据库表中的数据 |
Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL(Data Definition Language, 数据定义语言, 表操作)
- 查询
查询所有数据库:查询当前数据库:1
show databases;
1
select database();
- 创建
1
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]
- 删除
1
drop database [if exists] 数据库名;
- 使用
1
use 数据库名;
如果要设置字符集,建议设置为utf8mb4(支持4个字节),而不是utf8(支持3个字节)。因为在数据库当中有些数据库是占4个字节的。
DDL-表操作-创建
DDL-表操作-查询
- 查询当前数据库所有表:
1
show tables;
- 查询表结构:
1
desc 表名;
- 查询指定表的建表语句:
1
show create table 表名;
DDL-表操作-数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
类型 | 大小 | SIGNED | UNSIGNED | 描述 |
---|---|---|---|---|
TINYINT | 1 byte | (-128, 127) | (0, 255) | 小整数值 |
SMALLINT | 2 bytes | (-32768, 32767) | (0, 65535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8388608, 8388607) | (0, 16777215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2147483648, 2147483647) | (0, 4294967295) | 大整数值 |
BIGINT | 8 bytes | (-2^63, 2^63-1) | (0, 2^64-1) | 极大整数值 |
FLOAT | 4 bytes | (-3.402823466 E+38, 3.402823466351 E+38) | 0 和 (1.175494351 E-38, 3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8 bytes | (-1.7976931348623157 E+308, 1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
DDL-表操作-修改
添加字段
1
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]
修改数据类型
1
alter table 表名 modify 字段名 新增数据类型(长度);
修改字段名和字段类型
1
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]
删除字段
1
alter table emp drop username;
修改表名
1
alter table 表名 rename to 新表名;
删除表
1
drop table [if exists] 表名;
删除指定表,并重新创建该表
1
truncate table 表名;
注意:在删除表时,表中的全部数据也会被删除。
总结
DML(Data Manipulation Language, 数据操作语言)
- 添加数据
1
insert
- 修改数据
1
update
- 删除数据
1
delete
DML-添加数据
给指定字段添加数据
1
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...);
给全部字段添加数据
1
insert into 表名 values (值1, 值2, ...);
批量添加数据
1
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
1
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
注意:
- 插入数据时,指定的字段顺序需要与值的顺序一一对应。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内。
DML-修改数据
1 | updata 表名 set 字段名1 = 值, 字段名2 = 值2, ... [where 条件]; |
注意:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
DML-删除数据
1 | delete from 表名 [where 条件] |
注意:
- DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据.
- DELETE语句不能删除某一个字段的值(可以使用UPDATE)。
DQL (Data Query Language,数据查询语言)
用来查询数据库中表的记录。
DQL-语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
- 基本查询
- 条件查询 (WHERE)
- 聚合函数 (count, max, min, avg, sum)
- 分组查询 (GROUP BY)
- 排序查询 (ORDER BY)
- 分页查询 (LIMIT)
DQL-基本查询
DQL-条件查询
DQL-聚合函数
注意:null值不参与所有聚合函数运算。
分组查询
注意:
- 执行顺序:where > 聚合函数 > having
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
排序查询
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
分页查询
注意:
- 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
DQL-执行顺序
总结
DCL(Data Control Language,数据控制语言)
DCL-管理用户
DCL-权限控制
函数
字符串函数
数值函数
日期函数
流程函数
约束
外键约束
删除/更新行为
多表查询
概述
内连接
外连接
内连接
联合查询
子查询
标量子查询
列子查询
行子查询
表子查询
SQL之case when then用法
https://www.cnblogs.com/Richardzhu/p/3571670.html
事务
事务(Transactions)是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式地提交事务。
事务控制语句:
- 开启事务 (两种写法均可)
1
start transaction;
1
begin;
- 开启事务
1
commit;
- 开启事务
1
rollback;
例:
1 | -- 开启事务 |
事务的四大特性 (ACID)
- 原子性 (Atomicity)
事务是不可分割的最小单元,要么全部成功,要么全部失败 - 一致性 (Consistency)
事务完成时,必须使所有的数据都保持一致状态 - 隔离性 (Isolation)
数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 - 持久性 (Durability)
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
索引
索引(index)是帮助数据库高效获取数据的数据结构。
无索引 -> 全表扫描,数据量越大,性能越低。
优点
- 提高数据查询的效率,降低数据库的IO成本。
- 通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
缺点
- 索引会占用存储空间。
- 索引大大提高了查询效率,同时却也降低了insert、update、delete的效率。
结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree结构阻止的索引。
思考:为什么MySQL不采用二叉搜索树或红黑树?
因为在大数据量的情况下,层级深,检索速度会慢。B+Tree (多路平衡搜索树)
语法
注意:
- 主键字段,在建表时,会自动创建主键索引。
- 添加唯一约束时,数据库实际上会添加唯一索引。