结构化的查询语言,关系型数据库中通用的一类语言。
SQL标准 89 92 99 03
# 2.1 mysql客户端自带的功能
mysql> help
# 2.2 Server端分类命令
mysql> help contents
mysql> help Data Definition
mysql> help CREATE DATABASE
DDL: 数据库定义语言
DCL: 数据控制语言
DML: 数据操作语言
DQL: 数据查询语言
作用: 规范SQL语句书写方式
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_ENGINE_SUBSTITUTION |
例子:
比如说:
在现实的数学角度,除法运算中,除数不能为0。
当MySQL中需要做除法运算时,为了保证符合现实的数学逻辑,也需要保证除数不能为0.
所以MySQL通过设定sql_mode参数值,规范我们的除法运算,从而保证不会出现违背现实数学逻辑的SQL语句
再比如说:
现实情况下,我们描述日期时,0年0月0日,在现实中是不被允许的
NO_ZERO_IN_DATE,NO_ZERO_DATE
字符集:
utf8: 最大存储长度,单个字符最多3个字节
utf8mb4(建议): 最大存储单位,单个字符最多4个字节
差别:
utf8mb4支持的编码比utf8更多
举个例子:比如,emoji字符mb4中支持,utf8不支持。emoji表情字符,一个字符占4个字节,utf8存不下。
例如:5.7版本默认时latin1
create database zabbix charset utf8mb4
校对规则:
每种字符集,由喝多校对规则(排序规则)
show collation;
作用:
影响到排序的操作。简单来说就是大小写是否敏感。
mysql> show collation;
| utf32_general_ci | utf32 | 60 | Yes | Yes | 1 |
| utf32_bin | utf32 | 61 | | Yes | 1 |
utf8mb4_general_ci 大小写敏感
utf8mb4_bin 大小写不敏感
# 查看A的ASCII码
mysql> select ASCII('A');
# 当作计算器用
mysql> select 3+2;
列出常见数据类型,还有其他数据类型或者每个数据类型下面还有其他的子类型。
数字: 整数,小数
存储长度 二进制数字范围 十进制数字范围
tinyint 1B = 8bit 00000000~1111111 0~255,-125~127
int 4B = 32bit 略 0~2^32-1,-2^31~2^31-1
bigint 8B = 64bit 略 0~2^64-1,-2^63~2^63-1
mysql> create database oldboy charset utf8mb4;
mysql> use oldboy;
mysql> create table t1(id int ,name varchar(64), age tinyint)
mysql> show tables;
+------------------+
| Tables_in_oldboy |
+------------------+
| t1 |
+------------------+
mysql> desc t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(64) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
char(长度):定长字符串类型 255字符
varchar(长度):变长字符串类型 65535字符
例如:
char(10):最多存10个字符,如果存储的字符不够10个,自动用空格填充剩余空间。对于磁盘空间都会占到10个字符长度。
varchar(10):最多存10个字符,按需分配存储空间
补充:
1. varchar类型,在存储数据时,会先判断字符长度,然后合理分配存储空间,然后合理分配存储空间。
char类型,不会判断,立即分配空间。
在固定长度的列中,还会推荐选择char类型。
例子:
varchar(10)
abcde ---> 1. 判断字符长度---> 2. 申请空间 ---> 3. 存字符---> 申请一个字节存储5这个数字
char(10)
abcde ---> 1. 申请10个字符空间 ----> 2. 存字符+空格填充
2. varchar类型。除了会存储字符串之外,还会额外使用1-2字节存储字符长度。
abcdef ---> 6+1 # 在额外申请一个字节存储字节长度(比如6这个数值)
aaaaaaaaaaaaaaaaaaaaaaaa..254 , 254+1
aaaaaaaaaaaaaaaaaaaaaaaa..1000 , 1000+2
3. 应用场景
字符串固定长度的话,char类型,不固定用varchar类型
4. 括号中数字问题
括号中,设置的是,字符的个数,无关字符类型。
但是不同种类的字符,占用的存储空间不一样的。
对于英文和数字,每个字符占一个字符长度。
对于中文,占用空间大小,要考虑字符集。
utf8,utf8mb4,每个中文,占3个字符长度。emoji字符,占4个字节长度。
总长度不能超过数据类型的最大长度。
彩蛋: 以上两种数据类型选择需考虑周全,会影响到索引应用。
# 查看t2表n1列的长度
mysql> select length(n1) from t2;
enum('bj','sh','sd',......)枚举类型
1 2 3 "下表索引"
说明: 字符串类型
作用:
例如:
id telnum name shenfenzheng shen
1 123456 zhangsan 4253xxxx 山东省
上海市
山东省
.....
DATETIME
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
TIMESTAMP
1970-01-01 00:00:00.000000 至 2038-01-19 03:16:07.999999
timestamp会受到时区的影响
DATETIME占用8个字节长度
TIMESTAMP占用4个字节长度
二进制类型(mysql不太擅长,比如图片视频,如果放土拍你视频可以放到图数据库neo4j中)
{
id: 101
name: 'zhangsan'
}
Primary Key : 主键约束,作用:唯一+非空,每张表只能有一个主键,作为聚簇索引。
not null : 非空约束,作用:必须非空,我们建议每个列都设置非空。
unique key : 唯一约束,作用:必须不重复的值
unsigned : 针对数字列,非负数
default : 默认值
comment : 注释
# 客户端自带命令
mysql> help
\c 结束上条命令运行
\G 格式化输出
\q 退出MySQL会话 (ctrl+d)
source 导出SQL脚本,类似于<
system 调用Linux命令
tee mysql操作的内容和结果输入指定文件 比如:tee /tmp/mysql.log
notee 关闭tee功能
Linux 中一切皆命令,Linux中一切皆文件。
MySQL中一切皆SQL,MySQL一切皆库、表。
SQL规范网站:https://www.sqlstyle.guide/zh/
(1) 库定义: 库名 库属性
创建库:
CREATE DATABASE oldguo CHARSET utf8mb4;
规范:
1. 库名: 小写,业务有关,不要数字开头,库名不要太长,不能使用保留字符串
2. 必须指定字符集
(2) 查库
mysql> show databases;
mysql> show create database oldguo;
(3) 修改库
mysql> alter database oldguo charset utf8mb4;
A ----> B
B是A字符集的严格超集。就是B字符集的内容范围比A大,这样才不会出乱码问题
可以修改库的属性(如字符集),但是不能修改库名
(4) 删除库: 危险, 不代表生产操作。
注意: 生产数据库中,除了管理员,任何人没有删库的权限。
mysql> drop database wordpress;
表定义:
(1) 创建表
CREATE TABLE `wordpress`.`wp_users`(
`id` INT NOT NULL AUTO_INCREMENT COMMENT '用户序号',
`name` VARCHAR(64) NOT NULL COMMENT '用户名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
`gender` CHAR(1) NOT NULL DEFAULT 'F' COMMENT '性别',
`cometime` DATETIME NOT NULL COMMENT '注册时间',
`shengfen` ENUM('北京市','上海市','深圳市','重庆市') NOT NULL DEFAULT '北京市' COMMENT '省份',
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4;
小提示: 数字有默认的存储长度,可以不用写。 UNSIGNED数字列不能为负数。如果性别就只有男和女的话不需要使用枚举,用tinyint或者char就可以了
建表规范:
1. 表名:
小写字母
不能数字开头
表名和业务相关
名字不要太长
不能使用关键字
2. 必须设置存储引擎和字符集
3. 数据类型: 合适,简短,足够
4. 必须要有主键
5. 每个列尽量上设置not null,不知道填啥,设定默认值
6. 每个列要有注释
7. 列名不要太长
优化建议题目:
建议: id太大,int(10)就够。warehouse_id 如果是数字应该换数据类型为数字的,station_region_id 如果是数字应该换数据类型为数字的,replenish_type 用enum可以节省空间
c_t 应该用时间类型,u_t同上,is_deleted tinyinst(1) , 字符集utf8mb4 比较好。distribution_cost 这个用decimal数据类型
(2) 查询表
# 查看库下的表
mysql> show tables;
# 查看表结构或者表属性
mysql> desc wp_users;
# 创建表的详细信息
mysql> show create table wp_users;
(3) 修改表
# 1. 添加手机号序列
mysql> alter table wp_users add column shouji bigint not null unique key comment '手机号';
# 2. 将shouji列数据类型修改为char(11)
mysql> alter table wp_users modify shouji char(11) not null unique key comment '手机号';
# 3. 删除手机号列(危险)
mysql> alter table wp_users drop shouji;
(4) 删除表(谨慎操作)
drop table wp_user;
后文中涉及