9/3
今日考题
1.MySQL如何修改密码
1.set password=password('密码');
# 该密码命令修改的是当前登录用户的密码
2.# 在不登录的情况下修改
mysqladmin -u用户名 -p原密码 password 新密码
2.如何查看数据库基本信息及修改字符编码
查看数据库基本信息:show databases
通过复制配置文件之后重命名为my加入一串百度得来的配置文件
然后重启服务端
3.如何操作库、表、记录(重点)
# 针对库的
1.查
show databases;
show create database test_base;
2.增
creat database test_base;
3.改
alter database test_base charset='gbk';
4.删
drop database test_base;
# 针对表的
select database();
use test_base;
1.查
show tables;
show create table test_table;
desc test_table;
2.增
create table test_table(name char,pwd char);
3.改
alter table test_table modify name varchar(16);
4.删
drop table test_table;
# 针对记录
1.查
select * from test_table;
select name from test_table;
2.增
insert into test_table values('leo','123')('ace','123');
3.改
update test_table set pwd='666' where name='leo';
4.删
delete from test_table where name='leo' ;
delete from test_table ;
ps:默写写不出来不要立马看笔记,努力想几分钟 加深大脑印象
内容概要
- 存储引擎
- 创建表的完整语法
- MySQL基本数据类型
- 字段的约束条件
详细讲解
存储引擎
# 存储引擎
MySQL 内部有很多种不同的存储方式
简单理解为;我们把这些不同的存储方式称之为存储引擎
# 如何查看各类存储引擎
show engines
# 主要存储引擎有
InnoDB
5.5版本之后的默认存储引擎
支持事物 行锁 外键 >>> 数据安全性高
'''
事务 保证多个数据操作要么全部完成要么全部失败
eg; 银行转账 转出方和收款方要么双方都成功要么都失败
行锁 多一行行数据加锁 同一时间只有一个人操作
eg; 抢票功能 很多人打开抢票网站但实际抢到的只会是前面那几个
外键 建立表关系 之后会有详细展开
'''
MyISAM
5.5之前的版本默认存储引擎
不支持事务 外键 等功能 >>> 安全性较于InnoDB低
但是存取速度优于InnoDB
memory
数据直接存储在内存里 所以速度飞快 但是一断电就全没了
blackhole
数据写进去就进黑洞了 直接消失
存储引擎表文件
# MySQL中不区分大小写
create table test_t1(id int)engine=innodb;
create table test_t2(id int)engine=myisam;
create table test_t3(id int)engine=memory;
create table test_t4(id int)engine=blackhole;
# 写入之后就可以去打开文件查看不同引擎生成的文件
InnoDB有两个文件
.frm 表结构
.idb 表数据 索引(类似于目录)
MyISAM有三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引 # 功能越独立精简效率越高
memory有一个文件
.frm 表结构 # 既然写在内存里也就不会在硬盘里展示数据了
blackhole有一个文件
.frm 表结构 # 写进去就没了所以也不需要数据和索引了
# 存储数据特性
insert into test_t1 values(1);
insert into test_t2 values(1);
insert into test_t3 values(1); # 为了验证一下特性把服务器重启一下
insert into test_t4 values(1);
# 之后再用select * from ... 查看一下数据
select * from test_t1;
select * from test_t2;
select * from test_t3;
select * from test_t4;
创建表的完整语法
create table 表名(
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件
)
'''
字段名和字段类型是必须的 宽度和约束条件是可选的
约束条件可选 并且一个字段可以支持多个约束条件
结尾字段语句不能有逗号 因为之后一般也不会在终端操作而是在文本里面写好复制的数据多了复制一行行的最后很容易忘记
'''
create table test_t5(
id tinyint not null unique,
name varchar(16) not null
)
字段类型
整型
tinyint
smallint
int
bigint
'''由上至下存储的数字越来越大'''
那如果输入的数字超过怎么办
create table test_t6(id tinyint);
insert into test_t6 values(-150),(256); # 输入多个元素括号括号逗号隔开
下图可以看到默认自带正负符号
那想要去掉就添加一个约束条件
create table test_t7 (id tinyint unsigned);
insert into test_t7 values(-150),(256); # 两次可以看出超出范围的就按最大数字显示
浮点型
float
double
decimal
'''不同的浮点型存储小数的范围和精度不一样'''
float(255,30) # 总共255位小数位占30位
double(255,30) # 总共255位小数位占30位
decimal(65,30) # 总共65位小数位占30位
'''表面上float和double是一样的 但是这里面区别还是很明显的'''
create table test_t8(id float(255,30));
create table test_t9(id double(255,30));
create table test_t10(id decimal(65,30));
insert into test_t8 values(8.888888888888888888888888888888);
insert into test_t9 values(8.888888888888888888888888888888);
insert into test_t10 values(8.888888888888888888888888888888);
这样简单比对就可以明显看出精确度的差距
# 精确度 float < double < decimal
'''
精确度问题在很多场景下都会发生 有时候我们会采取不同的类型来存储
eg;
比如手机号全部是数字存储的时候应该使用整型 但是有时候我们使用字符类型
'''
字符类型
char
varchar
'''上述的两个数据类型存储的本质有明显区别'''
char(4)
最多可以存储4个字符 超过了报错 没有超过也按照四个字符存储(默认空格填充)
varchar(4)
最多可以存储4个字符 超过了报错 没有超过则按照实际有几个字符存几个
create table test_t11(id int,name char(4));
create table test_t12(id int,name varchar(4));
insert into test_t11 value(666,'leoYang');
insert into test_t12 value(666,'leoYang');
这里并没有像之前所说的报错 可是这种情况是需要避免的因为一旦出现后面的数据其实是错误的
# 所以这边插入一下关于严格模式的知识可以直接找到下一个小标题
当你再次回到这里的时候严格模式已经开启了严格模式我们再试一下
select char_length(name) from test_t11; # 统计字符长度
但是无论我们怎么去看也看不到自动帮我们填充的字符
'''因为默认情况下MySQl会在存储时自动填充然后读取的时候再把自动填充去掉'''
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 上述代码可以让我们明白填充的字符存在 同样需要退出后再进入
insert into test_t11 value(888,'S');
insert into test_t12 value(888,'S');
char:
优点 整存整取 速度块
缺点 浪费存储空间
varchar:
优点 节约存储空间
缺点 存取速度较于char慢点
# 存储数据就一定会需要考虑效率问题
varchar存储的内部实际上是在每个字符串前加了1bytes的数据来提示数据是几位
eg:
leotomacebobleetenamy
# 这一大串字符如果是char(3)一下子就知道
leo tom ace bob lee ten amy 这样的人名
# 但是如果是varchar(3)又怎么分辨呢
就得1bytes+leo 1bytes+tom 1bytes+ace 1bytes+bob 1bytes+lee 1bytes+ten 1bytes+amy这样存储时间自然就久了
严格模式
# 查看严格模式
show variables like '%mode%';
# 修改严格模式
set global sql_mode = 'strict_trans_tables';
设置好退出客服端然后再进入 就完成了
时间类型
date # 年月日
time # 时分秒
datetime # 年月日时分秒
year # 年
'''都是和英文一个意思非常好记'''
那接下来就试一下
create table test_t13(
birth date,
breaktime time,
revive datetime,
destory year
);
# 时间数据大多是自动获取的 在python中也见识过了 就通过时间函数导入
这里做一下演示作用
insert into test_t13 values('1998.11.29','12:12:12','1998.11.29.7.7.7','2002');
# 仔细看下面格式 会自动调整
枚举与集合类型
enum 枚举 # 多选一
set 集合 # 多选多 当然也能多选一
# 枚举例子
create table test_t14(gender enum('male','female','others'));
insert into test_t14 values('男');
insert into test_t14 values('male');
# 不是预设好的数据中的内容就会报错
# 集合例子
create table test_t15(hobby set('basketball','football','baseball','doublecolorball'));
insert into test_t15 values('bodybilding');
insert into test_t15 values('baseball');
insert into test_t15 values('basketball,baseball');
# 一样是只能在预设的数据中选择 可以多选也能单选
宽度补充
针对字符很好理解就是多少表示几个字符
# 但是对于数字来说宽度仅仅代表展示长度
create table test_t16(age int(1));
insert into test_t16 values(18);
# 你会发现一切正常
'''所以以后定义数字的时候就不用再添加宽度了'''
约束条件
unsigned # 无符号
zerofill # 0填充
'''
插入数据两种方式
insert into test_t17 values()
需要按照字段顺序依次传入 不能多也不能少
insert into test_t17(id,name) values()
按照指定的字段传入 没有写的字段可以不填
'''
后面的插入方法没有的数据会显示null意思是空
create table test_t17(
id int,
name varchar(16)
);
insert into test_t17(id) values(1);
not null # 不能为空
加上之后我们再试一下
create table test_t18(
id int,
name varchar(16) not null
);
insert into test_t18(id) values(1);
default # 默认值
刚才报错看到说是没有默认值所以不能为空
那我们就再加上新的约束条件
create table test_t19(
id int,
name varchar(16) not null default 'somebody'
);
insert into test_t19(id) values(1,'leo'); # 报错 没有指定的字段就填不进去
insert into test_t19(id) values(1);
insert into test_t19 values(1,'leo');
上图填了就按照填的来没填就使用默认值
'''但是id这里重复了'''
unique # 唯一
这里就要加入唯一这个约束条件
create table test_t20(
id int unique,
name varchar(16) default 'somebody'
);
insert into test_t20(id) values(1);
insert into test_t20 values(1,'leo'); # 报错
'''已经有id1了所以后面一行就不能用了'''
这种是单列唯一
接下来看多列唯一
'''多列唯一就是单项可以重复但是多项在一起就不能完全一样'''
create table test_t21(
host int,
port int,
unique(host,port)
);
insert into test_t21 values(128,122);
insert into test_t21 values(128,130);
insert into test_t21 values(122,122);
insert into test_t21 values(128,122);
# 只有完全重复的才会报错