一、表的概念
表就相当于文件,表中的一条条记录就相当与文件的一行行内容,不同的是,表中的一条条记录有对应的标题,这个标题就叫做表字段
二、创建表:
#语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件] #[]括号内为约束条件,可加可不加,最后一组数据后面没有逗号
);#注意:
1. 在同一张表中,字段名是不能相同2. 宽度和约束条件可选3. 字段名和类型是必须的
4.最后一个字段后面不能加逗号
ps:宽度指的是对存储数据的限制
create table userinfo(name char);
insert into userinfo values('jason');
1:没有安全模式下的数据版本,能够存放数据但只会存存进去一个g
2:char(1) 表示只能存一个字符,插入的时候MySQL自动截取
3:严格模式下mysql会报错
1;先切换到指定的库下面:use 库名 或者:create table userinfo.t1(id int,name char);
2:查看当前存在的库: select database();
3:查看表: show tables: show create table userinfo; 常用查看表结构: desc userinfo <<==>> describle userinfo
4:删除: drop table useriinfo:
5:如果要清空表,使用truncate t1;
作用:将整张表重置,id重新从0开始记录
三、约束条件:
1:not null : 不能为空
2:unique :唯一约束,指定某列或者几列组合不能重复
3:default :默认值
4:primary key:主键为了保证表中的每一条数据的该字段都是表格中的唯一值,
换言之,它是用来独一无二地确认一个表格中的每一行数据。
1:约束条件初识>>> null 与 nut null
create table t1(id int,name char notnull); # 条件是不能为空
insert into t1 values(1,'j'); #正常存储
insert into t1 values(2,null); #报错
#总结 类型与约束条件区别#类型:限制字段必须以什么样的数据类型存储#约束条件:约束条件是在类型之外添加一种额外的限制
四、存储引擎
不同的数据应该有不同的处理机制,MySQL的存储引擎:
重点了解前两种,面试经常问
mysql存储引擎
Innodb:默认的存储引擎 查询速度较myisam慢 但是更安全
myisam:mysql老版本用的存储引擎
memory:内存引擎(数据全部存在内存中),数据断电消失
blackhole:无论存什么 都立马消失(黑洞)
研究一下每个存储引擎存取数据的特点
show engines;
现如今保证数据安全是最重要的,而不是取决与速度
#查看不同存储引擎存储表结构文件特点
create table t2(id int)engine=innodb;
create table t3(id int)engine=myisam;
create table t4(id int)engine=blackhole;
create table t5(id int)engine=memory;
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
insert into t5 values(1);
各种模式存储的数据的表结构如下:
五、MySQL数据类型
建表的时候,字段都有对应的数据类型
1;数值类型
2:时间日期类型:
3:字符集类型
4:ENUM和SET类型
重点掌握:整形,浮点型 字符集型(char与varchar)日期类型 枚举与集合
1:整形
分类:分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
#默认为有符号,即数字前有正负号
验证整型字段有无符号及范围
create table t1(x tinyint);
insert into t1 values(128),(-129);
create table t2(x tinyint unsigned);
insert into t2 values(-1),(256);
create table t3(x int unsigned);
insert into t3 values(4294967296);
疑问:类型后面的宽度能否改变字段存储的大小限制
create table t4(x int(8));
insert into t4 values(4294967296123);#显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);#create table t6(id int(10) unsigned);#create table t7(id int(11));
强调:对于整形来说,数据类型后的宽度并不是存储限制,而是显示的限制,所以在创建表时,如果字段采用的是整形类型,
完全无需指定显示宽度,默认的显示宽度,足以显示完整的存放的数据
char后面的数字是用来限制存储数据的长度的
特例:只有整型后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数
int(8) 够/超8位有几位存几位,不够8位空格填充
修改约束条件 不够8位的情况下 用0填充
六、严格模式
存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
show variables like "%mode%"; #查看数据库配置中变量名包含mode的配置参数#修改安全模式
set session #只在当前操作界面有效
set global #全局有效
setglobal sql_mode ='STRICT_TRANS_TABLES'
#修改完之后退出当前客户端重新登陆即可
为了能让MySQL减少工作量,在做条件判断时做出快速的判断,加上严格的模式,不符合条件就直接报错
2、浮点型
浮点类型:FLOAT DOUBLE decimal
作用:存储薪资、身高、体重、体质参数等
字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数
三者最大整数位和小数位的对比:
#存储限制
float(255,30) # 总共255位 小数部分占30位
double(255,30)
decimal(255,30)#精确度的验证
create table t1(x,float(255,30));
crteae table t2(x,double(255,30));
create table t3(x,decimal(65,30));
insert into t1 values(1.1111111111111111111111111111111); #小数点后30位
insert into t2 values(1.1111111111111111111111111111111);
insert into t3 values(1.1111111111111111111111111111111);
精确度
float < double < decimal
通常情况下会将数字在数据库存储上变成字符串来方便存储 不需要考虑精确度带来的问题
3:字符类型
分类
char(固定长度)
varchar(可变长度)
作用:姓名,地址,描述类信息
char(4) #最大只能存放四个字符,超出会直接报错,如果少了,会自动用空格填充
varchar () #最大只能存放四个字符,超出来会直接报错,如果少了,有多少就存放多少
create table t1(name char(4));
create table t2(name varchar(4));
# 验证存储限制
insert into t12 values('hello');
insert into t13 values('hello');
# 验证存储长度
insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a'
select * from t12
select * from t13 # 无法查看真正的结果
select char_length(name) from t12
select char_length(name) from t13 # 仍然无法查看到真正的结果
mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
但是再取出来的那一瞬间 mysql会自动将填充的空格去除
可以通过严格模式 来修改该机制 让其不做自动去除处理
char与varchar的区别:
char(定长):
1:浪费空间 2:存取速度快
varchar(变长):
1:节省空间 2:比char存取速度较慢
存取的时候,都通过给数据加一个记录数据的报头,后解析报头,因为它不知道数据的长度大小
4、日期类型:
date:年月日
datetime:年月日十分秒
year:年
time:时间
uptime:执行的时间
create table stdent(
id int,
name char(16),
bron_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'jack','2009','2019-05-09','11;11;00','2019-11-11 11;11;11');
4、枚举与集合类型:
枚举(enum) :单选 只能在给定的范围内选一个值(多选一):
如性别 sex 男male/女female
集合(set) : 多选 在给定的范围内可以选择一个或一个以上的值
(爱好1,爱好2,爱好3...)
cretae table usesr(
id int,
name char(16),
gender enum('male',''female','others')
);
inster into user values(1,'jack','xxxx') #报错
inster into user values(2,'egon','femal') #正确
create table teacher(
id int,
name char(16),
gender enum('male','female','others')
hobby set ('read','sleep','sanna','dbj')
)
insert into teecher
values(1,'egon','male','read,sleep,bdj') # 集合也可以 只存一个
七、约束条件
"""PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
1、not null 不能为空
create table user(
id int,
name char(16)
);
insert into user values(1,null) #可以修改
alter table user modify name char(16) notnull;
insert into user(name,id) values(null,2); #报错 插入数据可以在表名后面指定插入数据对应的字
2、default 给某个字段设置默认值(不设置时会有自带的默认值)
create table student(
id int,
name char(16) notnull,
gender enum('male','female','others') default 'male')
insert into student(id,name) values(1,'jason') #成功
往列表中插入数据的时候 可以指定字段进行插入 不需要全部都插;
insert into t10(name,id) values('reso',2)
3、unique :标识唯一
单例唯一,限制某一个字段是唯一的
#单列唯一
create table user1(
id int unique,
name char(16)
);
insert into user1 values(1,'jason'),(1,'egon') #报错
insert into user1 values(1,'jason'),(2,'egon') #成功
4、联合唯一(在语句的最后 用括号的形式 表示那几个字段组合的结果时唯一的)
例如:IP+port(端口)
# 联合唯一
create table server(
id int,
ip char(16),
port int,
unique(ip,port)
)
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080); # 报错
insert into server values(1,'127.0.0.1',8081);
5、primary key 主键
限制效果和 not null +unique 组合效果一致 非空且唯一
# 单从约束角度来说primary key就等价于not null unique
create table t11(id int primary key);
desc t11;
insert into t11 values(1),(1); # 报错
insert into t11 values(1),(2);
# 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
"""
primary key 也是innodb 引擎查询必备的索引按,照这个条件能快速查询
innodb引擎在创建表的时候 必须要有一个主键
当你没有指定主键的时候
1.会将非空切唯一的字段自动升级成主键
2.当你的表中没有任何的约束条件 innodb会采用自己的内部默认的一个主键字段
该主键字段你在查询时候是无法使用的
查询数据的速度就会很慢,类似于一页一页的翻书
强调:1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键"""create table t12(
id int,
name char(16),
age int not null unique,
addr char(16) not null unique
)engine=innodb;
desc t12;
2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
索引:类似于书的目录,没有主键就相当于一页一页翻着查3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键"""# 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
create table t18(
ip char(16),
port int,
primary key(ip,port)
);
desc t18;
# 主键id作为数据的编号,每次最好能自动递增
create table t13(
id int primary key auto_increment,
name char(16)
);
insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增
# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
2、联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键,
innodb 引擎中一张表有且只有一个主键
#联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
create table t18(
ip char(16),
port int,
primary key(ip,port)
);
desc t18;
3、auto_increment 自动递增
主键字段应该具备自动递增的特点,每次添加数据,不需要用户手动输入
#auto_increment 自动递增
主键id作为数据的编号,每次最好能自动递增
create table t13(
id int primary key auto_increment,
name char(16)
);
insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增
# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
#表中记录的id会按自动递增的方式自动加入
补充:
delete fromtb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
deletefrom tb1 where id > 10;
如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录