一、创建表的完整语法
create table 表(
字段名1 类型 [(宽度) 约束条件],
字段名2 类型 [(宽度) 约束条件],
字段名3 类型 [(宽度) 约束条件]
);
1.类型:使用限制字段必须以什么样的数据类型传值
约束条件:约束条件是在类型之外添加一种额外的限制
2.注意点
1.在同一张表中,字段名不能相同
2.宽度和约束条件可选,字段名和类型是必须的
3.最后一个字段后不用加逗号
二、基本的数据类型:
1、整型
1、作用:id号,各种号码,年龄,等级
2、分类: tinyint,int,bigint
3、注意:强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制
所以在创建表示,如果字段采用的是整型类型,完全无需指定显示宽度,
默认的显示宽度,足够显示完整当初存放的数据
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok
2、浮点型
1.作用:存储身高、体重、薪资
2.分类:float、double、decimal
create table t3(x,float(255,30)); create table t4(x,double(255,30)); create table t5(x,decimal(65,30)); insert into t3 values(1.111111111111111111111111111111) insert into t4 values(1.111111111111111111111111111111) insert into t5 values(1.111111111111111111111111111111) cmd运行 mysql> select * from t9; +----------------------------------+ | x | +----------------------------------+ | 1.111111164093017600000000000000 | +----------------------------------+ 1 row in set (0.00 sec) mysql> select * from t10; +----------------------------------+ | x | +----------------------------------+ | 1.111111111111111200000000000000 | +----------------------------------+ 1 row in set (0.00 sec) mysql> select * from t11; +----------------------------------+ | x | +----------------------------------+ | 1.111111111111111111111111111111 | +----------------------------------+ 1 row in set (0.00 sec)
3.相同点:
1.对于三者来说,都能存放30位小数,
4.不同点:
1.精度的排序从低到高:float、double、decimal
2.float与double类型能存放的整数位比becimal更多
3、字符类型
1.作用:姓名,地址,描述性的信息
2.分类:
char : 定长,简单粗暴,浪费空间,存取速度快
字符长度范围:0-255(一个中文是一个字符,是utf8编码的3字节)
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
varchar :变长,精确,节省空间,存取速度慢
字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
存储:varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符 create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个 insert into t12 values('hello'); insert into t13 values('hello'); insert into t12 values('a'); #'a ' insert into t13 values('a'); #'a' set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; select char_length(x) from t12; #4 select char_length(y) from t13; #1
注意:
针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
但会在读出结果时自动去掉末尾的空格,因为末尾的空格在字段明确地等于一个值的场景中是无用
4、日期类型
分类:
date:1999-01-27
time:11:11:11
datetime:1999-01-27 11:11:11
year: 1999
create table student( -> id int, -> name varchar(20), -> born_year year, -> birth date, -> class_time time, -> reg_time datetime); insert into student values -> (1,'alex',"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"), -> (2,'egon',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"), -> (3,'wsb',"1998","1998-01-01","13:13:13","2017-01-01 13:13:13"); MariaDB [db1]> select * from student; +------+------+-----------+------------+------------+---------------------+ | id | name | born_year | birth | class_time | reg_time | +------+------+-----------+------------+------------+---------------------+ | 1 | alex | 1995 | 1995-11-11 | 11:11:11 | 2017-11-11 11:11:11 | | 2 | egon | 1997 | 1997-12-12 | 12:12:12 | 2017-12-12 12:12:12 | | 3 | wsb | 1998 | 1998-01-01 | 13:13:13 | 2017-01-01 13:13:13 | +------+------+-----------+------------+------------+---------------------+
5、枚举与集合类型
作用与分类:
枚举enum,多选一个
集合set,多选多
create table consumer( name char(16), sex enum('male','female'), level enum('vip1','vip2','vip3','vip4','vip5',) hobby set ('play','music',read','study')); insert into consumer values ('egon','male','vip5','read,study'), ('alex','female','vip1','girl'); cmd 运行 select * from consumer; +------+--------+-------+------------+ | name | sex | level | hobby | +------+--------+-------+------------+ | egon | male | vip5 | read,study | | alex | female | vip1 | | +------+--------+-------+------------+
三、约束条件
1、not null 与default
是否可空,null表示空,非字符串
not null 不可空
null 可空
默认值,创建列表可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table t15( id int, name char(16) not null, sex enum('male','female','other') not null default "male" ); insert into t15(id,name) values (1,'egon1'), (2,'egon2'), (3,'egon3'); cmd 运行 mysql> desc t15; +-------+-------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------------------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(16) | NO | | NULL | | | sex | enum('male','female','other') | NO | | male | | +-------+-------------------------------+------+-----+---------+-------+ 3 rows in set (0.04 sec)
2、unique:限制字段的值唯一(就是独一无二)
#单列唯一 create table t16( id int unique, name char(16) ); # 联合唯一 create table server( id int unique, ip char(15), port int, unique(ip,port) );
3、primary key:单单从约束角度去看,primary key 就等同于not null unique
1.强调
1.一张表中必须有,并且只能有一个主键
2.一张表中都应该有一个id字段,而且应该把id字段做成主键
单列做主键 create table t11( id int primary key, name char(16), age int, sex char(6) ); 联合主键 create table t12( ip char(15), port int, primary key(ip,port) ); 单列cmd查看: mysql> desc t11; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | char(16) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | char(6) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 联合cmd查看: mysql> desc t12; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | ip | char(15) | NO | PRI | | | | port | int(11) | NO | PRI | 0 | | +-------+----------+------+-----+---------+-------+
4、auto_increment
约束字段为自动增长,被约束的字段必须同时被key约束
create table t13( id int primary key auto_increment, name char(16) ); mysql> insert into t13(name) values('egon'),('alex'); cmd 运行: mysql> select * from t13; +----+------+ | id | name | +----+------+ | 1 | egon | | 2 | alex | +----+------+ 2 rows in set (0.02 sec)
1.注意点:
1.通常与primary key连用,而且通常是给id字段加
2.auto_incremnt只能给被定义成key(unique key,primary key)的字段加