DevOps开发运维
成长之路

MySQL的DDL数据定义语言和DCL数据控制语言

SQL客户端slient内置命令

db01 [world]>help
\c 类似于ctrl+c,结束上一条命令
\G 格式化输出,一般针对列特别多的场景使用
exit(\q) 退出当前会话
source 导入sql脚本,类似于<
system 调用linux中的命令,比如system cd /tmp && ls 调用linux中的命令

DDL库定义

DDL数据定义语言指对于库和表定义的创建删除修改

1.创建数据库

show databases; 查看所有数据库
create database school; 创建school数据库
create schema sch; 创建数据库sch
create database test charset utf8; 创建字符集为utf8的test数据库;
show charset; 查看数据库支持的所有字符集
show collation;看字符集支持的校队规则
create database xyz charset utf8mb4 collate utf8mb4_bin;创建字符集为utf8mb4且校队规则为大小写敏感的xyz数据库
show create database xyz; 查看xyz数据库详细信息
注:在MySQL中,Create Schema和Create Database的作用是一样的
建库规范
1.库名不能有大写字母,不能使用内置字符
2.建库要加字符集
3.库名不能有数字开头
4.库名要和业务相关
建库标准语句
mysql> create database db charset utf8mb4;
mysql> show create database db;

2.删除数据库

drop database xyz;
(生产中禁用命令)

3.修改数据库

show create database school;查看school库的详细信息
alter database school charset utf8;修改school库的字符集
注意:修改字符集,修改后的字符集一定是原字符集的严格超集

4.查询数据库

show databases; 查看所有数据库
show create database school;查看school库的详细信息

DDL表定义

语法结构

create table stu(
列1 属性(数据类型、约束、其他属性) ,
列2 属性,
列3 属性
)

1.创建表

use school;
create table stu(
id int not null primary key auto_increment comment '学号',
name varchar(255) not null comment '姓名',
sage tinyint unsigned not null default 0 comment '年龄',
sgender enum('m','f','n') not null default 'n' comment '性别',
sfz char(18) not null unique comment '身份证',
intime timestamp not null default now() comment '入学时间'
)engine=innodb charset=utf8 comment '学生表';
建表规范:
1. 表名小写
2. 不能是数字开头
3. 注意字符集和存储引擎
4. 表名和业务有关
5. 选择合适的数据类型,剪短,足够使用
6. 每个列都要有注释
7. 每个列设置为非空,无法保证非空,用0来填充。
8. 必须有主键
9. 每个列尽量设置not null
10.列名不要太长

2.删除表

drop table t1;
(生产中禁用命令)

3.表查询

use school 进入到school库
show tables; 显示school库下所有的表名
desc stu;显示school库的stu表的所有列信息
show create table stu;显示school库的stu表的建表语句
create table ceshi like stu;创建一个和stu表一样的ceshi表
desc ceshi;查看ceshi表

4.修改表

修改后的B表是原始表的严格超集。表名无法修改
alter table 表名 add (column) ...    column可以省略

在stu表中添加qq列

show tables; 显示school库下所有的表名
desc stu;显示school库的stu表的所有列信息
alter table stu add qq varchar(20) not null unique comment 'qq号';

在name后加微信列

alter table stu add wechat varchar(64) not null unique comment '微信号' after name;

在id列前加一个新列num

alter table stu add num int not null comment '数字' first;

把刚才添加的列都删掉(危险)

alter table stu drop num;
alter table stu drop qq;
alter table stu drop wechat;

修改name数据类型的属性

alter table stu modify name varchar(128) not null;
修改属性一定要把与原表列重叠的的属性都加上

将sgender 改为 sg ,数据类型改为 CHAR 类型

alter table stu change sgender sg char(1) not null default 'n';
注意:modify只能改字段数据类型完整约束,不能改字段名,但是change可以。change修改的范围和力度要比modify 大。
修改数据类型,修改字段位置 ---用modify;修改名字 --就用change

线上DDL(alter)操作对于生产的影响

 SQL审核平台:yearing,incception
扩展:MySQL元数据类似于linux的inode信息。
说明:在MySQL中,DDL语句在对表进行操作时,是要锁‘元数据表’的。此时所有修改类的命令无法正常运行,所以在是对于大表,业务繁忙的表,进行线上DDL操作时
,要谨慎,尽量避开业务繁忙期,否则会影响线上业务 。
在需要紧急上线情况下,可以使用pt-osc(pt-online-schema-change),gh-ost工具(在线DDL工具),减少锁表时间,对业务的影响。
mysql8.0以后已经整合了这个工具,可以不用pt工具。

DCL应用

grant all on *.* to root@'10.0.0.%' identified by '123'; 授权用户
show grants for root@'10.0.0.%';查看授权
revoke delete on app.* from app@'10.0.0.%';回收权限
赞(2)

评论 抢沙发

评论前必须登录!

 

LNMP社群 不仅仅是技术

关于我们网站地图