目录
一、MySQL 基础概念与架构
二、MySQL 库的操作
三、MySQL 表的操作
四、MySQL 表操作与数据类型
五、总体小结
## 一、MySQL 基础概念与架构
MySQL 是关系型数据库管理系统(RDBMS);mysqld 是服务端守护进程;mysql 是客户端命令行工具。
mysql 作为一种网络服务,是 C/S 模式,
mysql 是一套给我们提供数据存取服务的网络程序,
数据库一般指的是在磁盘或内存中存储的、有一定结构的、有组织的数据,也就是存放在磁盘上存储的一套数据库方案。
mysql的出现原因:一般文件存储也提供了数据的存储,但是文件并没有提供非常好的数据管理能力,数据库的本质是对数据内容管理的一套解决方案。
工作过程:mysql 向 mysqld 发送请求,mysqld 在磁盘中调用数据文件,对数据进行分析,然后将处理完的数据返回给 mysql。
所谓创建数据库,本质就是创建文件夹,在数据库创建表,本质就是在指定目录下创建文件。
数据库本质就是文件,只是这些文件并不由程序员直接操作,而是由数据库服务帮我们操作。
库中存的表是二进制文件。
真实情况:MySQL 8.0 起表的元数据不再使用 .frm 文件,统一存入 InnoDB 数据字典表;InnoDB 默认 innodb_file_per_table 开启时,每张表是一个 .ibd 文件,含数据加索引。"一个表等于一个二进制文件"不是通用结论。
mysql 分三层:连接层〔网络连接、权限认证和安全管理〕、对语法和词法的分析层和存储引擎层
其实:规范分层是连接层、Server 服务层、存储引擎层。其中"分析层"只是 Server 服务层里的一部分,即解析器、优化器、执行器;顺序也应写成连接层、服务层、引擎层。
(存储引擎:进行增删查改的核心层,不同引擎进行的功能不同
最底层就是将数据存入硬盘中。
更正:存储引擎负责数据存取,但 InnoDB 有 Buffer Pool 内存缓存,读写不是每次都直接落盘;持久性靠 redo log,回滚靠 undo log。说"最底层就是存硬盘"漏掉了缓存与日志。)
因此 mysql 就是基于 OS 的文件系统的一个文件系统。
存储引擎:可以根据我们所需挑选特定的引擎。
SQL 语句分类:
① DDL:维护存储数据的结构,对数据库和表的操作
② DML:对表的数据进行操作
③ DCL:用于权限管理
补充:这条本身对。补充:SQL 分类通常还有 TCL,即 COMMIT、ROLLBACK、SAVEPOINT 等事务控制语句;以及 DQL,即 SELECT 查询。只列 DDL、DML、DCL 三分法是不完整的。
二、MySQL 库的操作
创建数据库
create database if not exists xxx;
旁注:\[\] 叫可选选项(但实际输入时不用加 \[\])
旁注:xxx 是数据库名
旁注:〔后面可跟〕charset,这是指定编码集
sudo ls /var/lib/mysql/ ⇒ 前面是 linux 指令,其余的是 mysql 内部的指令
mysql -uroot -p
show databases 展现已有数据库
删除数据库
drop database xxx; ⇒ 要带上分号,删掉 xxx 数据库
更正:语法对,但笔记没写风险。它会连同库内所有表一起删除,且不可恢复。
创建/删除数据库的本质就是在 /var/lib/mysql 下创建或删除一个目录
更正:数据目录由 datadir 参数决定,多数发行版默认确实是 /var/lib/mysql,但不能当成"永远如此"。可用 SHOW VARIABLES LIKE 'datadir'; 确认。
创建数据库时,有两个编码集:
1、数据库编码集 ------ 存储时数据库编码用的格式
2、数据库校验集 ------ 管理数据库的比较与排序方法
在对一个数据库操作时必须保证编码格式的一致性。
默认使用的是 utf-8
更正:三处问题。第一,默认字符集随版本变化,5.7 默认 latin1,8.0 默认 utf8mb4。第二,MySQL 里的 utf8 是 utf8mb3 的别名,最多 3 字节,存不了 emoji,应使用 utf8mb4。第三,带连字符的 utf-8 不是 MySQL 的合法字符集名。
例:create database d4 charset=utf8 collate utf8_general_ci
旁注:charset=utf8 设置编码集
旁注:collate ... 设置校验集
use xxx ⇒ 进入这个数据库
进入后 show tables ⇒ 展现所有的表名
看表结构要用 desc 表名,或 show create table 表名\G。
desc person ⇒ 展现一个表的内部结构
## 三、MySQL 表的操作
边栏:
use xxx ------ 进入这个数据库+show tales就是展现所有表名
desc xxx ------ 查看一个表中的列属性
show tables ------ 显示这个库中所有表
create database xxx ------ 建一个库
drop database xxx; ------ 删除库
mysql -uroot -p ------ 登录
正文:
MySQL 表的操作
create table 表名 ( 变量名 类型 comment '注释', 变量名 类型 ... )
建表示例:
create table 表名(
** 字段1 类型 comment '注释',**
** ...**
) charset=xxx collate=xxx engine=InnoDB;
旁注:表名 / 字符集 / 校验集 / 存储引擎
注意:charset 和 collate 不加会使用默认的
更正:方向对,但要说明默认值的来源,它继承服务器级和数据库级的默认设置。
desc 表名 ------ 查看一个表的信息
show create table 表名 \G ------ 查看创建表时的详细信息(所有属性)
由 \G 可以格式化
更正:\G 是 mysql 客户端的语句结束符,用来替代分号,作用是让结果竖排显示便于阅读。它是结束符,不是一个"格式化命令"。
修改表:
alter table xxx rename to xxx; ------ 修改表名
更正:正确。补充:RENAME TO 的 TO 可以省略,写成 ALTER TABLE a RENAME b; 同样合法。
alter table xxx add 变量名 类型; ------ 在表中加一个新变量
alter table xxx rename column 老名 to 新名; ------ 修改列名
更正:语法对,但 RENAME COLUMN 需要 MySQL 8.0 及以上;5.7 及更早只能用 CHANGE 老名 新名 类型。
alter table xxx drop 变量名; ------ 删除一列
alter table xxx modify 变量名 类型/属性 ------ 修改类型
更正:这条对,值得强调:MODIFY 只改类型和属性,不能改名。
alter table employee change xxx xxx ------ 修改字段(改名加改类型,类型也要改)
更正:对,但 CHANGE 必须把新类型完整写出来,不能省略。
## 四、MySQL 表操作与数据类型
drop table xxx ------ 删除表
更正:语法对,但 DDL 会隐式提交事务、无法回滚,删表前应确认或先备份。
DDL:对表结构的操作
DML:对数据库中数据的操作
DCL:管理权限
数据类型
※ 声明 类型
mysql 中整型有符号、无符号 / unsigned(即 tinyint unsigned)也有 tinyint(占 1 字节)
更正:tinyint 占 1 字节是正确的,1 字节等于 8 bit。
一是约束:mysql的特定类型不会存非法数据,mysql 会直接拦截用户的非法输入,保证数据的有效性。
bit 类型 ( )中是位的个数
更正:"括号中是位的个数"是对的。bit(M) 的 M 就是位数,范围 1 到 64,默认 1。
float(显示长度,小数点精度)> 4 字节
更正:第一,float(M,D) 这种写法在 MySQL 8.0.17 起已被废弃、会产生警告,建议直接用 float,要精确小数用 decimal(M,D),金额场景尤其如此。第二,字节数方面 float 是 4 字节(单精度),double 是 8 字节,笔记写 4 字节是对的。
(只是对float类型)使用 unsigned 时,负数范围直接砍掉,其余不变。
## 五、总体小结
架构:mysql 客户端到 mysqld 服务端,再到存储引擎,最后落到磁盘文件,中间还有 Buffer Pool 缓存与 redo、undo 日志。
库表本质:库对应数据目录下的目录,表对应文件,但 8.0 后表结构元数据已改为集中存放在数据字典中。
字符集与校验集:charset 管"怎么存",collate 管"怎么比、怎么排";默认值随版本与层级变化,生产环境建议显式写 utf8mb4 加 utf8mb4_general_ci。
DDL、DML、DCL:改结构、改数据、管权限,另需知道 TCL 与 DQL。
修改列:MODIFY 不改名,CHANGE 可改名但必须写全类型。
最需要优先记住的 5 条
1、sudo cd 不成立。cd 是内建命令,提权对它无效。
2、校验集 collate 不是"管理编码格式",它管的是比较与排序。
3、建表写 character=xxx 是错的,应为 charset= 或 character set。
4、unsigned 不是"其余不变",而是正数上限翻倍。
5、float 是 4 字节,double 是 8 字节;float(M,D) 写法已废弃,金额用 decimal(M,D)。