mysql 数据库DBA课程03_02 SQL基础应用

SQL 常用种类
DDL 数据定义语言
DCL 数据控制语言
DML 数据操作语言
DQL 数据查询语言

字符集:( charset )
Mysql 5.7 中默认字符集是latin1 拉丁语




show charset; #查看字符集
utf8 还有一些长的字符串存不下 ##早期的,一个中文字符是占3个字节,不支持emoji
utf8mb4 这才明真正的utf8 建议使用 utf8mb4,一个中文字符占4个字节,支持emoji
emoji,表情,就是用这种字符来存储的

5、排序规则:collation
show collation; 查看排序规则(检对规则)
对于英文字符串的,大小写的敏感



数据类型:
mysql 中规化成了 4 种
数字:
整数
        tinyint 极小整数数据类型:0-255
        smallint 较小整数数据类型(-2^15 到 2^15-1 )
mediumint
        int 常规大小的整数数据类型 -2^31 到 2^31-1
        bigint
较大整数数据类型 -2^63 到 2^63-1

浮点数
字符串
char(100) 最多能存255个字符
定长字符串,不管字符串长度多长,都立即分配100个字符长度的存储空间,未存满,用空格填充。
varchar(100) 变长字符串,每次存储数据之前,要先判断字符长度按需分配字符存储空间。

会单独申请一个字符长度的空间,存储字符长度,(在字符串少于255个的前提下),如果字符串超过255,就会申请2个字符长度的存储空间来存储字符长度。理论上最多能够存储65535字符串,实际上只能存65533

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

enum 枚举数据类型
address enum('sz','sh','bj','tj','sd') 只能在这里选择,系统会自动给里面的值加一个编号相对应。 1 2 3 4 5
时间
生产中用得最多的两个:
datetime 范围为从1000-01-01 00:00:00.000000至9999-12-31 23:59:59.999999
不会根据时区,自动变化。
timestamp 范围从1970-01-01 00:00:00.0000002038-01-19 03:14:07.999999
可以根据时区,自动转换

二进制(略)
++++++++++++ DDL的应用,对表(列,列属性),库进行操作,修改,删除。
DDL语句库的定义:
创建库:
create database zabbix charset utf8mb4
collate utf8mb4_bin;
字符集 校对规则(可省略)
查看的语句,不属于DDL,属于DQL
看建库语句的详细信息:
show create database zabbix;


删除库:drop database zabbix;
修改库 字符集
注意:一定是从小往大了改,比如,utf8 改成 utf8mb4
目标字符集一定是源字符集的超集,就是能包含源字符集的意思。
查看数据库的字符集:
show create database wordpress;




alter database abc charset utf8mb4;

库的定义规范:
库名使用小写字符
库名不能使用数字开头(可以直接在数据目录中,创建,use `123`;可以进入,不建议。)
库名不能是数据库内部的关键字
必须要设置字符集
表的定义
创建 #每个表也可以设置字符集
    表名,列名,列属性,表属性。
    列属性:
    primary key :主键约束,一个表只能有一个主键,非空且值唯一。
    not null:非空约束,必填项。
    unique key :唯一键约束,不允许重复值。
    default :默认值,一般配合not null 一起使用。
    unsigned:无符号,一般是配合数字列,非负数。
    auto_increment : 自增长的列,一般用于ID 列。
create table stu (
id int primary key not null auto_increment comment '学号',
sname varchar(255) not null comment '姓名',
age tinyint unsigned not null default 50 comment '年龄',
gender enum('m','f','n') not null default 'f' comment '性别',
intime datetime not null default now() comment '入学时间'
) engine innodb charset utf8mb4

建表规范:
表名小写字母,不能数字开头。
不能是保留字符,使用和业务有关的表名。
选择合适的数据类型及长度
每个列设置 not null + default ,对于数据 零 填充,对于数字,使用有效字符填充。
每个列设置注释
表必须设置存储引擎和字符集
主键列尽量是列数字列,最好是自增长的。
enum 不要保存数字,只能设置在字符串上。
查看建表信息:
show create table stu;


创建一个和另一个表,一模一样的表结构的表。
create table test like stu;
删除表: drop table test;
修改表:查看表结构: desc stu;
--- 在stu 表中添加qq列 ******** 生产中用得最多,不在乎位置。

alter table stu add qq varchar(15) not null comment 'qq号';
注意:在线修改表结构,是要锁表的。

当有要紧急情况下修改表结构,而且是在线上操作。这时怎么办???
用这个表创建一个临时表,数据都一样的。就是复制这张表,用sqlyog 连接上去,选择表,有复制选项。
修改这个临时表的结构
将原有表改名,再将临时表改成原有表名。

也可以用一些工具来实现 pt-osc 在线ddl 工具,减少锁表的情况。
++++++++++++++++++++++++++++++
---- 在sname 后,添加微信列
alter table stu add wechat varchar(60) not null unique comment '微信号' after sname; #在那一列后添加字段。

----- 在id 列前加一个新num
alter table stu add num int not null unique comment '身份证号' first; #添加到最前面
---- 把刚才添加的列都 删除掉
alter table stu drop num; #只能一个一个删除,也会锁表。

----- 修改sname 数据类型
alter table stu modify sname varchar(64) not null comment '姓名';

----- 将gender 改为sg 类型改为char
alter table stu change gender sex char(4) not null comment '性别';

++++++++++++++ DCL 对数据行的 ,增 删 改

常用 就是 grant授权 revoke回收权限 语句

++++++++ DML +++++ 3条语句
insert、update、delete
插入数据:
insert stu values (1,'zs',18,'m',now());
# Mysql 中的insert 语句,可以不加into

最规范写法:
insert into stu(id,sname,age,sex,intime) values (2, 'ls',28,'m',now());

针对性的录入数据:有默认值 的那些可以不写。
insert into stu (sname,age,sex) values ('ysj',20,'f'); #字段只写要插入数据的那些,必须把字段写出来。
------ 一次性录入多行数据
insert into stu (sname,age,sex) values ('ysj',20,'f'), ('scl',28,'f'), ('wbl',33,'f'), ('dl',24,'f');