MySQL8.0之DDL语句(详细全面)

数据库之DDL语句

DDL(Data Definition Language)语句: 数据定义语言,主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。

一、MySQL字符集简介

字符集规定了字符在数据库中的存储格式,比如占多少空间,支持哪些字符等等。不同的字符集有不同的编码规则,在有些情况下,甚至还有校对规则的存在。在运维和使用MySQL数据库中,选取合适的字符集非常重要,如果选择不恰当,轻则影响数据库性能,严重的可能导致数据存储乱码。 对MySQL8 以后来说 性能影响不大

为什么字符集会对数据库有些影响(了解):

mysql修改字符集 性能影响谈谈性能优化:Mysql 的字符集以及带来的一点存储影响...撕得粉·扔的博客-CSDN博客

查看全部字符集:

show charset;
字符集 长度 说明
GBK 2bit 支持中文,但是不是国际通用字符集
UTF-8 3bit 支持中英文混合场景,是国际通用字符集
utf8mb4 4bit 完全兼容UTF-8,用四个字节存储更多的字符,支持emoji(表情包)

MySQL数据库在开发运维中,字符集选用规则如下: 1、如果系统开发面向国外业务,需要处理不同国家、不同语言,则应该选择utf-8或者utf8mb4。 2、如果只需要支持中文,没有国外业务,则为了性能考虑,可以采用GBK

创建数据库。同时指定数字集

create database 库名 default charset utf8mb4

二、排序规则

说起排序规则就离不开字符集,严格来说,排序规则是依赖于字符集的

字符集是用来定义MySQL存储不同字符的方式,而排序规则一般指对字符集中字符串之间的比较、排序制定的规则。一种字符集可以对应多种排序规则,但是一种排序规则只能对应指定的一种字符集,两个不同的字符集不能有相同的排序规则

总结:

字符集决定了能够存储哪些字符,比如 ASCII 字符集只能存储简单的英文、数字和一些控制字符;GB2312 字符集可以存储中文;Unicode 字符集能够支持世界上的各种语言。排序规则定义了字符集中字符的排序和比较顺序,包括是否区分大小写,是否区分重音等。

查看全部字符集:

 show collation;

查看mysql默认的字符编码状况

注意:在MySQL 8.0 之后 所有的默认创建库的字符集都为 utf8mb4 , 排序方式都是 utf8mb4_bin

MySQL 5.7 不指定默认字符集与排序方式 是latin1的方式

对 latin1 字符集感兴趣的 可以去这个博客简单看看,或者自行百度吧

MySQL基础知识---------Latin1_卧浪居士的博客-CSDN博客

查看排序规则

show variables like "%character%";
# 查询内容详解
1,设置客户端使用的字符集
2,设置链接数据库时的字符集
3,设置创建数据库的编码格式
4,文件系统的编码格式
5,数据库给客户端返回数据时的编码格式
6,服务器安装时指定的编码格式
7,数据库系统使用的编码格式
8,字符集的安装目录
排序规则 对于英文字符串的,大小写的敏感
utf8mb4_general_ci 大小写不敏感
utf8mb4_bin 大小写敏感(存拼音,日文)

针对已有数据库修改排序规则

alter database 库名 collate utf8mb4_bin

排序规则:

MySQL 排序规则云满笔记的博客-CSDN博客mysql排序规则选什么

MySQL字符串类型

MySQL数据类型---字符串Cat God 007的博客-CSDN博客mysql 字符串

MySQL字符串类型 用法 详解
char char(100) 为定长格式,写入两个字符 剩下的98个会用空格占满
varchar varchar(100) 为变长格式,写入两个字符占一个空格 剩下的会压缩 超过255会多占两个空格
enum enum(“男”,”女”,”保密”) 字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举

如何选择这两个数据类型? 少于255个字符串长度,定长的列值,选择char 多于255字符长度,变长的字符串,可以选择varchar

DDL的应用

创建数据库

CREATE DATABASE test1 CHARSET utf8mb4 COLLATE utf8mb4_bin;

查看

# 列出所有库名
SHOW DATABASES;
# 查看创建库的结构
SHOW CREATE DATABASE 库名;
# 查看所有表
SHOW TABLES; 
# 显示创表语法和存储引擎,还有字符集
SHOW CREATE TABLE 表名;
# 显示表的列结构
DESC 表名;
# 创建一个表结构一样的表
CREATE TABLE 表1 LIKE 表2;

删除数据库、删表 慎用

DROP DATABASE 库名;
DROP TABLE 表名;

索引类型和操作方式

索引类型 详解 用法
主键索引 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引 ALTER TABLE 表名 ADD UNIQUE (列名); 创建唯一索引 ,ALTER TABLE 表名 ADD UNIQUE (列1,列2);创建唯一组合索引
普通索引 基本的索引类型,没有唯一性的限制,允许为NULL值 ALTER TABLE 表名 ADD INDEX 索引名 (列名);创建普通索引,ALTER TABLE 表名 ADD INDEX 索引名(列1, 列2, 列3);创建组合索引

主键索引 与 唯一索引的 区别只在于 能否为空 以及能否创建多个

唯一索引与普通索引的区别在于 数值可重复

查看索引创建情况

show index from 表名;

查看索引的参数说明

参数(show index from 表名;) 详解
Table 表示创建索引的数据表名
Non_unique 表示该索引是否是唯一索引。若不是唯一索引,则该列的值为 1;若是唯一索引,则该列的值为 0。
Key_name 表示索引的名称
Seq_in_index 表示该列在索引中的位置,如果索引是单列的,则该列的值为1;如果索引是组合索引,则该列的值为每列在索引定义中的顺序。
Column_name 表示定义索引的列字段
Collation 表示列以何种顺序存储在索引中。在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类
Cardinality 索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大
Sub_part 表示列中被编入索引的字符的数量。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为NULL。
Packed 指示关键字如何被压缩。若没有被压缩,值为 NULL。
Null 用于显示索引列中是否包含 NULL。若列含有 NULL,该列的值为 YES。若没有,则该列的值为 NO。
Index_type 显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)。
Comment 显示评注

索引的优缺点

优点:

一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

二、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

五、通过使用索引,可以在查询的过程中,使用查询优化器,提高系统的性能。

缺点:

一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。

三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

DDL 定义表

DDL --- 表定义 重点

列属性 详解
PRIMARY KEY 主键约束,表中只能有一个,非空且唯一. 主键不能重复 方便查询
NOT NULL 非空约束,不允许空值
UNIQUE KEY 唯一键约束,不允许重复值
DEFAULT 修饰符为字段设定一个默认值,一般配合 NOT NULL 一起使用
TINYINT 非常小的整数(TINYINT 最大是127,那 TINYINT UNSIGNED 最大 就可以到 127 * 2)
UNSIGNED 该属性只能用于设置数据类型,不允许数据列出现负数。如果不需要向某字段中插入负数,则使用该属性修饰可以使用该字段的最大存储长度增加一倍。例如,正常情况下数据类型TINYINT的数值范围在 -128 ~ 127,而使用UNSIGNED 属性修饰以后最小值为0,最大值可以达到255。
COMMENT 注释
AUTO_INCREMENT 自增长的列

mysql提供了五种整型tinyint、smallint、mediumint、int和bigint:

理解mysql中的unsigned是什么意思L.Cheng的博客-CSDN博客mysql tinyint unsigned

关于日期的详细内容

MySQL8.0中的日期类数据及其函数_Sun_Sherry的博客-CSDN博客

时间类型 详解
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-31
TIME "hh:mm:ss" 格式表示的时间值
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:14:07.999999。

MySQL8 创表语句的两种写法

CREATE TABLE test1(
id INT NOT NULL AUTO_INCREMENT COMMENT 'ID',
sno INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '学号',
sName VARCHAR(20) NOT NULL COMMENT '姓名',
sex ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
Time TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间',
-- Time DATE NOT NULL DEFAULT '1000-01-01' COMMENT '入学时间', # 注意设定默认值的时候 NOW 以及其他函数不管用
PRIMARY KEY(id),
INDEX(sName),
UNIQUE(sno)  # 写法误区 切勿在最后一行的时候  加逗号 !
)ENGINE INNODB CHARSET utf8mb4 COLLATE utf8mb4_bin AUTO_INCREMENT=10;

# 第二种写法
CREATE TABLE test2(
id INT PRIMARY KEY NOT NULL  AUTO_INCREMENT  COMMENT  'ID',
sno INT UNSIGNED NOT NULL DEFAULT 0  UNIQUE COMMENT '学号',
sname VARCHAR(255) NOT NULL  INDEX COMMENT  '姓名',
age TINYINT UNSIGNED  NOT NULL  DEFAULT 0 COMMENT '年龄',
gender ENUM('m','f','n')  NOT NULL  DEFAULT 'n' COMMENT '性别',
intime DATETIME  NOT NULL  DEFAULT NOW()  COMMENT  '入学时间' 
)ENGINE INNODB CHARSET utf8mb4 COLLATE utf8mb4_bin AUTO_INCREMENT=10;

查看表结构

DESC test1;
# 字段名称详解
1、字段名称(Field)
2、字段类型(Type)
3、字段是否为null
4、字段是否为主键(key)
5、字段的默认值(default)
6、Extra其他

删除索引

drop index 索引名 on 数据表名;
alter table 表名 drop index 索引名称;  # 可以删除 除主键索引以外的其他索引
# 注意如果自定义的索引名称 删除索引的时候需要 写自定义的名称 不然删除会失败

修改表

# 在 年龄 后面添加 微信 列
ALTER TABLE test1 ADD VX VARCHAR(20) NOT NULL COMMENT '微信号' DEFAULT '无' AFTER age;
# 删除列
ALTER TABLE test1 DROP VX;
# 放在第一列
ALTER TABLE test1 ADD qwe INT UNSIGNED NOT NULL UNIQUE COMMENT 'ID列' FIRST;
# 注意 如果不加 AFTER 和 FIRST的话 默认是放在最后列
ALTER TABLE test1 ADD ID_card INT UNSIGNED NOT NULL UNIQUE COMMENT '身份证';

# 修改表字段 限制条件
ALTER TABLE test1 MODIFY sName VARCHAR(60) NOT NULL COMMENT '名字';
# 更改表字段名字
ALTER TABLE test1 CHANGE VX WeChat VARCHAR(33) NOT NULL COMMENT '微信';

猜你喜欢

转载自blog.csdn.net/weixin_58279299/article/details/126307122