表的数据类型
tinyint
有符号:-128~127, 无符号:0~255, 默认有符号
create table t1(num tinyint);
insert into t1 values(1);
insert into t1 values(128); --越界报错
无符号:
create table t2(num tinyint unsigned);
insert into t2 values(-1); --报错
insert into t2 values(255);
float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
float(4, 2)表示的范围有符号数是-99.99~99.99,无符号数是0~99.99mysql在保存数值时会自动进行四舍五入
create table t3(id int, salary float(4, 2));
insert into t3 values(1, -99.99);
insert into t3 values(2, -99.991); --四舍
insert into t3 values(3, 99.986); --五入
decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal(5, 2)表示的范围是-999.99~999.99,这样来看decimal和float很像,但是两者表示的精度不一样
create table t4(id int, num1 float(10, 8), num2 decimal(10, 8));
insert into t4 values(1, 21.21335432, 21.21335432);
select * from t4;
这样看来,还是decima的精度更高一些,所以希望小数的精度更高,推荐使用decimal
char和varchar
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是 65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占用3个字节),如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节).
所以数据长度如果都一样,就使用定长(char),数据长度有变化,就使用变长(varchar).
日期和时间
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用八字节
date:日期 'yyyy-mm-dd',占用三字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节
enum和set
enum,可以理解为单选类型,设定提供了多个选项的值,最终一个单元内只存储了一个值
set,可以理解为多选类型,设定提供了多个选项值,最终一个单元格内可以存储多个值
创建一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单 选]:
create table votes(
name varchar(30),
hobby set('登山', '游泳', '篮球', '武术'),
gender enum('男', '女')
);
插入数据:
insert into votes values('李四', '登山', '女');
insert into votes values('张三', '游泳,武术', '男');
表的约束
空属性
虽然数据类型能够约束字段,但是数据类型比较单一,需要一些其他的约束,比如在学生表中,E-mail可以为空,但是姓名学号不能为空。我们可以创建一个班级表,表中必须要有班级和教室的名字,如果没有这两个就不知道在哪上课:
create table myclass(
class_name varchar(20) not null,
class_room varchar(20) not null
);
查看表结构,不允许为空:
默认值
使用关键字default,某一个属性经常性的出现某一个具体的值,可以在一开始指定好,在使用时,用户可以选择性的使用默认值
create table t6(
name varchar(20) not null,
age tinyint unsigned default 0,
sex char(2) default '男'
);
插入数据,不指定字段值,使用默认值
insert into t6 (name) values ('张三');
select * from t6;
列描述
列描述在创建表时没有实际意义,用来描述该字段,跟据表创建语句保存
create table t7 (
name varchar(20) not null comment '姓名',
age tinyint unsigned default 0 comment '年龄',
sex char(2) default '男' comment '性别'
);
一般用desc语句查看不到注释信息,使用下面语句查看,\G是以列显示:
show create table t7\G;
zerofill
格式化输出,如果宽度小于设定的宽度(这里设置的是 ),自动填充0。要注意的是,这只是最后显示的结果。
主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
创建表的时候直接在指定字段上添加:
create table t8(
id int unsigned primary key comment '学号不为空',
name varchar(20) not null
);
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主 键,可以使用复合主键。
create table t9(
id int unsigned,
course char(10) comment '课程代号',
score tinyint unsigned default 60 comment '成绩',
primary key(id, course) --组合主键
);
创建表之后追加主键
alter table 表名 add primary key(字段列表)
删除主键
alter table 表名 drop primary key
自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作, 得到一个新的不同的值。
通常和主键搭配使用,作为逻辑主键。
自增长的特点: 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
create table t10(
id int unsigned primary key auto_increment,
name varchar(20) not null
);
插入数据,可以不指定id
insert into t10 (name) values ('张三');
insert into t10 (name) values ('李四');
select * from t10;
唯一键
unique 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有 多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
create table t11(
id char(10) unique comment '不能重复,可以为空',
name varchar(20)
);
外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当 定义外键后,要求外键列数据必须在主表的主键列存在或为null。
foreign key (字段名) references 主表(列)
创建主键表
create table class(
id int primary key,
name varchar(20) not null comment '班级名'
);
创建从表
create table stu(
id int primary key,
name varchar(20) not null comment '学生名',
class_id int,
foreign key (class_id) references class(id)
);
综合案例
有一个商店的数据,记录客户及购物情况,有以下三个表组成:
1、商品goods(商品编号goods_ id,商品名goods_ name, 单价unitprice, 商品类别category, 供应商provider)
2、客户customer(客户号customer_ id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
3、购买purchase(购买订单号order_ id,客户号customer_ id,商品号goods_ id,购买数量nums)
要求:
每个表的主外键
客户的姓名不能为空值
邮箱不能重复
客户的性别(男,女)
--创建goods表
create table goods(
goods_id int unsigned primary key auto_increment,
goods_name varchar(100) not null default '',
unitprice decimal(10, 2) not null default 0.0,
category smallint not null default 0,
provider varchar(100) not null default ''
);
--创建customer
create table customer(
customer_id int unsigned primary key auto_increment,
name varchar(50) not null default '',
address varchar(100) not null default '',
email varchar(60) not null unique,
sex enum('男','女') not null default '男',
card_id varchar(20) not null unique
);
--创建purchase
create table purchase (
order_id varchar(30) not null primary key,
customer_id int unsigned,
goods_id int unsigned,
nums int not null default 0,
foreign key(customer_id) references customer(customer_id),
foreign key(goods_id) references goods(goods_id)
);