(三)数据类型
? ? ? ? ? ? 数值型 整数:tinyint,smallint,int,bigint int:4个字节,1个字节是8位,32 查询速度:索引是建立在字段基础上的,会存储字段的数据?? ? 表设计中数据类型选择第一条原则,选择合适的字段数据类型,最小且满足实际需要 tinyint,smallint smallint? 2个字节 tinyint? 1个字节,最多的使用场景是用来做状态位? ? -128-127? ?status 0,1,2,3,4 create table order( id int orderstatus tinyint unsinged?default 0 comment"0:已完成,1:正在发货,2:" level 1-100 svip level 1- ) unsinged 无符号,0-255 int(M)M值只是用来表示显示宽度 int(1)和int(10)有什么区别? ?影响的是显示宽度
?create?table?test_int(col1?int,col2?int(5));?
存储空间还是一样的,默认显示全的11位,用0填充的时候会有区别,会把前面的位补齐
auto_increment int 20多亿? ?起始值从1开始,当达到最大值了,插入会失败
delete是不会减小自增的起始值
truncate可以,相当于表重建,起始值归于1
自增字段一定是个key,一般都是用来做主键,primary key
?
小数
float·
double
当数值变多的时候? float和double精度会不准确
decimal(M,D) M代表总长度 D代表小数点后的位数 ? bit 字符串 char(M)? 固定的? ? ?存储的位数和字符集有关系? ? M代表字符? ?M是多少,就占用多少个字符 varchar(M)? 实际存储空间和和字符集有关系? ? text? 5.7以后支持全文索引 blob? 游戏行业? 二进制流 char和varchar区别 在结尾有空格的情况下,char默认会去掉结尾空格,varchar会 保留结尾空格 char(4)? 4个字符? 实际存储空间? 每个字符占多少字节,utf-8一个字符占3个字节? ?utf-8:4*3=12字节 varchar(4) 4代表最大存储字符数,如果存了1个字符,存储空间1*3+1=4个字节? ? 长度不固定,为什么+1,是因为需要一个字节的长度表示到底存了多少个字符? ? 一旦超过255,需要+2,??256*3+2= X? ? ? ? ? ? ?AAAA 0-255 一个字节代表0-255,超过255以后,一个字节代表不了了,就需要两个字节 ? 定长和非定长在索引优化上,可能定长的更好一些 实际使用场景: varchar:朋友圈 char可以做数据合法性校验? ?序列号? ?长度固定 text ? ? 时间 时间数据类型:year,data,datatime,timestamp,time 2018 2018-11-24 2018-11-24 11:18:00 current timestamp? on update 这个字段发生变更了,这张表的时间戳字段就会发生变更 时区,是否依赖操作系统 ? 一张表中,多个timestamp字段,只有一个timestamp有on update? 会随着字段的变更发生变更 timestamp适合用于统计分析,哪些表发生了哪些变化 把一个时间函数转换为时间戳 时间戳? 1970年到现在过去的秒数 把一个时间戳转换为时间 mysql中可以直接乘除法,当计算器用 ? enum类型和set类型 enum枚举? ?限定了取值范围,必须是给定范围的一个 set? ?是必须是给定范围的子集 ? 练习 student表 id字段 名字字段? 一般名字不会超过10个字符 出勤状态 开学时间 性别 年龄
?CREATE?TABLE?`student`?(
??`ID`?int(11)?NOT?NULL?AUTO_INCREMENT?COMMENT?‘主键ID‘, ??`name`?varchar(20)?DEFAULT?‘‘?COMMENT?‘学生姓名‘, ??`stu_status`?tinyint(1)?DEFAULT?‘0‘?COMMENT?‘0:出勤,1:缺勤‘, ??`start_date`?datetime?DEFAULT?‘0000-00-00?00:00:00‘?COMMENT?‘开学时间‘, ??`gender`?enum(‘M‘,‘F‘)?DEFAULT?NULL?COMMENT?‘学生性别‘, ??`age`?tinyint(4)?DEFAULT?‘0‘?COMMENT?‘学生年龄‘, ??PRIMARY?KEY?(`ID`) )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?COMMENT=‘2018-学生信息表-by?yeq‘ 内置函数 内置函数可以直接用select调用 concat拼接 ? ? ? 去空格 重复 替换 比较两个字符的ascii码 ?从第几个字符开始截取的长度 取0-100的随机数 floor(x)返回小于等于x的最大整数值 select floor(rand()*100); round四舍五入 select round(rand()*100); 日期和时间函数 select date_add(now(),interval 3 day);当前时间+3天 select date_sub(now(),interval 3 day);当前时间-3天 select date_format(now(),"%Y年%m%月%d日%H:%m:%s"); select date_format(now(),‘%Y-%M-%D‘); ? 流程函数
create?table?salary(userid?int,salary?decimal(9,2));
insert?into?salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(6,null); select?*?from?salary;?
?
select userid,salary,ifnull (salary,0) from salary; select userid,salary,if(salary>2500,‘high‘,‘low‘) from salary;
select?userid,case?when?salary<=2000?
then?‘low‘?
when?salary<=3000?
then?‘mid‘?else?‘high‘
?end?from?salary?where?salary?is?not?null;?
?
其他函数
当前哪个库
select database();
当前哪个用户
select user(); ? 存储过程 delimiter //
create?procedure?simproc(out?param1?int)?begin?select?100?into?param1;?end //
把100赋值给param1? 参数param1是传出参数
?
随机密码
?delimiter?$$
CREATE??PROCEDURE?rand_string1(n?INT)? BEGIN ????DECLARE?chars_str?varchar(100)?DEFAULT?‘ [email?protected]#$%^*()<>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘; ????DECLARE?return_str?varchar(255)?DEFAULT?‘‘; ????DECLARE?i?INT?DEFAULT?0; ????WHILE?i?<?n?DO ????????SET?return_str?=?concat(return_str,substring(chars_str?,?FLOOR(1?+?RAND()*72?),1)); ????????SET?i?=?i?+1; ????END?WHILE; ????SELECT?return_str; END?$$ delimiter?;
存储过程,上层业务下沉,交由数据库处理,对数据库的性能消耗比较大,维护比较麻烦,不建议使用
?
视图
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |