一、创建表的完整语法
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 * fromt9;+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00sec)
mysql> select * fromt10;+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00sec)
mysql> select * fromt11;+----------------------------------+
| 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'
setglobal 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 * fromstudent;+------+------+-----------+------------+------------+---------------------+
| 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* fromconsumer;+------+--------+-------+------------+
| 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) notnull,
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 * fromt13;+----+------+
| 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)的字段加