Client :
Server :
实例: mysqld守护进程+线程(M,IO,SQL,Purge…)+预分配的内存(独占)
公司: boss+员工(经理,干活的)+ 办公区
Server层 (实例层)
engine层 (存储层)
和磁盘交互。相当Linux文件系统
具体见图。
参考:https://www.jianshu.com/p/e872bc12f583
Linux MySQL
目录 库
文件 表
库: 库名 、库属性
表: 表名、表属性、列(列名、列属性)、行 -----》 元数据(数据字典)+数据
mysql> show databases;
mysql> use mysql
mysql> show tables;
cd /data/3306/data
库: 对应着 OS 中的目录
表:
例如:
user 表 MyISAM
user.frm : 存储数据字典信息(列相关信息)
user.MYD : 存储数据行
user.MYI : 存储索引
servers 表 InnoDB
servers.frm : 存储数据字典信息(列相关信息)
servers.ibd : 存储数据行和索引
存储引擎:MySQL 内部的“文件系统”,和磁盘交互的结构。
segment(数据段) : 表的数据存放的位置,包含1-N个extent(区、簇)
extent (区、簇) : 包含了连续的64个pages,默认1M。
page (数据页) : 最小IO单元,默认是16KB 。连续的4个OS block。
关系型数据库当中通用的查询语言。全名:结构化查询语言。
SQL-89
SQL-92
SQL-99
SQL-03
DDL : 数据定义语言
DCL : 数据控制语言
DML : 数据操作语言
5.7+ 之后采用的是严格模式。
作用:
为了让我们SQL在执行时更加严谨、有意义,符合常识、逻辑、符合科学等。。。
例子:
1. 日期格式: 2020-07-01 0000-00-00
2. 除法运算: 除数不能为0
查看SQL_MODE:
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
设置SQL_MODE:
mysql> set sql_mode='';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /data/app/mysql-5.7.28-linux-glibc2.12-x86_64/share/charsets/ |
+--------------------------+---------------------------------------------------------------+
utf8 和 utf8mb4 区别?
例如:
utf8不完整,emoji表情字符是不支持,utf8mb4是支持的。
根本原因是,utf8 字符最大长度为3字节,utf8mb4是4字节。
作用: 约束存储的数据更加有意义,符合对于这个列的定义。
数字类型
字节量 范围
tinyint 1 0~255 -127~128
int 4 0~2^32-1 -2^31 ~2^31-1
字符串类型
char(10)
定长类型的字符串类型。最多存储10个字符。如果存了5个,剩余空间用空格填充。
varchar(10)
变长类型的字符串类型。最多存储10个字符。如果存了5个,按需分配存储空间,另外需要1-2字节,存储字符长度。
怎么选择:一般情况下 变长字符串就用varchar,固定长度一般采用char类型
enum() : 枚举类型
应用场景: 列中的数据,有限个数的值的时候,并且是有规律。
enum(‘bj’,‘sh’,‘tj’,…)
1 2
TIMESTAMP
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响
Primary key : 主键约束 ,要求设置为主键的列,储值时,非空且唯一。每张表只有一个主键。
not null : 非空约束,必须录入值
unique key : 唯一约束,不能重复值
unsigned : 数字类型约束,无符号。
default : 设置默认值,一般配合not null 使用
auto_increment : 针对数字列,自动增长,一般配合主键
comment : 列或者表进行注释
作用: 数据定义语言 。
创建库
CREATE DATABASE test CHARSET utf8mb4;
CREATE DATABASE wordpress;
查询库
SHOW DATABASES;
SHOW CREATE DATABASE test;
SHOW CREATE DATABASE wordpress;
修改库
ALTER DATABASE wordpress CHARSET utf8mb4;
删除库(生产禁用!!!!)
DROP DATABASE wordpress;
建表
USE test;
CREATE TABLE stu (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(64) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
intime DATETIME NOT NULL COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';
查表定义
SHOW TABLES;
SHOW CREATE TABLE stu;
DESC stu;
修改表定义
-- 添加和删除字段
-- 1. 在表中添加telnum char(11) not null unique key comment '手机号'
ALTER TABLE stu ADD COLUMN telnum CHAR(11) NOT NULL UNIQUE KEY COMMENT '手机号';
-- 2. 在sname后添加a列
ALTER TABLE stu ADD COLUMN a INT NOT NULL COMMENT '测试列' AFTER sname;
-- 3. 在第一列前添加b列
ALTER TABLE stu ADD COLUMN b INT NOT NULL COMMENT '测试列' FIRST ;
-- 4. 删除添加的a,b列
ALTER TABLE stu DROP COLUMN a;
ALTER TABLE stu DROP COLUMN b;
-- 5. 修改数据类型
ALTER TABLE stu MODIFY telnum VARCHAR(20) NOT NULL UNIQUE KEY COMMENT '手机号';
ALTER TABLE stu MODIFY telnum VARCHAR(30) NOT NULL UNIQUE KEY COMMENT '手机号';
-- 6. 修改列名及数据类型
ALTER TABLE stu CHANGE telnum tel VARCHAR(64) NOT NULL UNIQUE KEY COMMENT '手机号';
删除表
drop table stu;
库: CREATE DATABASE test CHARSET utf8mb4;
1. 库名要与业务有关
2. 库名不使用大写字母、数字开头。
3. 不要使用内置关键字
4. 建库要指定字符集。
5. 生产中禁止使用删库操作。
表:
CREATE TABLE stu (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(64) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
intime DATETIME NOT NULL COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';