当前位置:   article > 正文

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

mysql ddl key

数据库之DDL语句

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

一、MySQL字符集简介

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

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

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

查看全部字符集:

show charset;
字符集长度说明
GBK2bit支持中文,但是不是国际通用字符集
UTF-83bit支持中英文混合场景,是国际通用字符集
utf8mb44bit完全兼容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博客

查看排序规则

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

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

alter database 库名 collate utf8mb4_bin

排序规则:

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

MySQL字符串类型

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

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

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

DDL的应用

创建数据库

CREATE DATABASE test1 CHARSET utf8mb4 COLLATE utf8mb4_bin;

查看

  1. # 列出所有库名
  2. SHOW DATABASES;
  3. # 查看创建库的结构
  4. SHOW CREATE DATABASE 库名;
  5. # 查看所有表
  6. SHOW TABLES;
  7. # 显示创表语法和存储引擎,还有字符集
  8. SHOW CREATE TABLE 表名;
  9. # 显示表的列结构
  10. DESC 表名;
  11. # 创建一个表结构一样的表
  12. CREATE TABLE1 LIKE2;

删除数据库、删表 慎用

  1. DROP DATABASE 库名;
  2. 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博客

时间类型详解
DATEYYYY-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 创表语句的两种写法

  1. CREATE TABLE test1(
  2. id INT NOT NULL AUTO_INCREMENT COMMENT 'ID',
  3. sno INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '学号',
  4. sName VARCHAR(20) NOT NULL COMMENT '姓名',
  5. sex ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
  6. age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
  7. Time TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间',
  8. -- Time DATE NOT NULL DEFAULT '1000-01-01' COMMENT '入学时间', # 注意设定默认值的时候 NOW 以及其他函数不管用
  9. PRIMARY KEY(id),
  10. INDEX(sName),
  11. UNIQUE(sno)  # 写法误区 切勿在最后一行的时候 加逗号 !
  12. )ENGINE INNODB CHARSET utf8mb4 COLLATE utf8mb4_bin AUTO_INCREMENT=10;
  13. # 第二种写法
  14. CREATE TABLE test2(
  15. id INT PRIMARY KEY NOT NULL  AUTO_INCREMENT  COMMENT  'ID',
  16. sno INT UNSIGNED NOT NULL DEFAULT 0  UNIQUE COMMENT '学号',
  17. sname VARCHAR(255) NOT NULL  INDEX COMMENT  '姓名',
  18. age TINYINT UNSIGNED  NOT NULL  DEFAULT 0 COMMENT '年龄',
  19. gender ENUM('m','f','n')  NOT NULL  DEFAULT 'n' COMMENT '性别',
  20. intime DATETIME  NOT NULL  DEFAULT NOW()  COMMENT  '入学时间'
  21. )ENGINE INNODB CHARSET utf8mb4 COLLATE utf8mb4_bin AUTO_INCREMENT=10;

查看表结构

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

删除索引

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

修改表

  1. # 在 年龄 后面添加 微信 列
  2. ALTER TABLE test1 ADD VX VARCHAR(20) NOT NULL COMMENT '微信号' DEFAULT '无' AFTER age;
  3. # 删除列
  4. ALTER TABLE test1 DROP VX;
  5. # 放在第一列
  6. ALTER TABLE test1 ADD qwe INT UNSIGNED NOT NULL UNIQUE COMMENT 'ID列' FIRST;
  7. # 注意 如果不加 AFTER 和 FIRST的话 默认是放在最后列
  8. ALTER TABLE test1 ADD ID_card INT UNSIGNED NOT NULL UNIQUE COMMENT '身份证';
  9. # 修改表字段 限制条件
  10. ALTER TABLE test1 MODIFY sName VARCHAR(60) NOT NULL COMMENT '名字';
  11. # 更改表字段名字
  12. ALTER TABLE test1 CHANGE VX WeChat VARCHAR(33) NOT NULL COMMENT '微信';

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/217270
推荐阅读
相关标签
  

闽ICP备14008679号