一、存诸引擎
存储引擎可以说是表类型,mysql根据不同的表类型有不同的存取机制,如果想了解请打开:
https://blog.csdn.net/miaoqinian/article/details/80242068
二 、表介绍
为了能简单容易明白理解表,可以把表当作文件,表中的一条记录,可以当成文件中的一行内容。不同的是表中的第一行内容,都有相对应的标题,我们称这个标题为字段。
来看一个简单的表:
其中:id,name,age,sex都是字段。
其中:1,monicx,23,male这一行称为一个记录。
三、 创建表的完整语法
create table 表名(字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
解释:
类型:使用限制字段必须以什么样的数据类型存值约束条件:约束条件是在类型之外添加一种额外的限制
注意:
1、在同一张表中,字段名是不能相同。2、字段名和类型是必须有的,宽度和约束条件是可选的。
3、最后一个字段后不加逗号。
创建一个表:
查看这个表结构:
向表中写入两行记录:
查看这看表中的所用内容:
四、表中的数据类型
可以详查看:http://www.runoob.com/mysql/mysql-data-types.html
Mysql中的主要类型有,整型,浮点型,字符型,日期类型,枚举与集合类型。
整型:
1、作用:id号,各种号码,年龄,等级2、主要分类:tinyint、int (重点常用)、bigint
3、测试:默认整型都是有符号的
create table t1(x tinyint);
insert into t1 values(128),(-129);
tinyint的最范围是-128~127。所以才会取得到上面的结果。
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(12) unsigned);
insert into t4 values(4294967296123);
对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制。
所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度,默认的显示宽度,足够显示完整当初存放的数据。
来个例子:表中数据显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);
insert into t5 values(1);
浮点型
作用:存储身高、体重、薪资
分类:
float (主要常用)、double 、decimal
测试:
相同点:对于三者来说,都能存放30位小数,
不同点:
1、精度的排序从低到高:float,double,decimal
2、float与double类型能存放的整数位比decimal更多
create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));
insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);
字符型
1、作用:姓名,地址,描述类的信息2、分类:char 定长、varchar 变长
3、测试:字符的宽度限制单位是字符个数
create table t12(x char(4)); # 超出4个字符取4个,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4));# 超出4个字符取4个,不够4个字符那么字符有几个就存几个
注意:
针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中,但会在读出结果时自动去掉末尾的空格
对比char与varchar
char(15)
缺点:浪费空间优点:存取速度都快
固定以15个字节的长度存数据
varchar(15)
缺点:存取速度都慢
优点:节省空间
(1bytes+数据)(1bytes+数据)(1bytes+数据)
日期类型
1、作用:时间相关2、分类:
date:1999-01-27
time: 11:11:11
datetime:1999-01-27 11:11:11
year:1999
3、测试
create table student(
id int,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
);
insert into student values(1,'monicx','1995','1995-04-14','08:30:00','2013-11-11 11:11:11');
枚举类和集合类
枚举enum,多选一个集合set,多选多
测试
create table teacher(
id int,
name char(16),
sex enum('male','female','others'),
hobbies set('read','music','running')
);
五、表的完整性约束
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
not null与default通常是连用的。
#not null + default
create table t15(
id int,
name char(16) not null,
sex enum('male','female') not null default "male"
);
insert into t15(id,name) values
(1,'monicx1'),
(2,'monicx2'),
(3,'monicx3');
unique的使用,可以单列,也可以联合多列组合唯一。
#unique:限制字段的值唯一
#单列唯一
create table t16(
id int unique,
name char(16)
);
# 联合唯一
create table server(
id int unique,
ip char(15),
port int,
unique(ip,port)
);
primary key:单单从约束角度去看,primary key就等同于not null unique
强调:
1、一张表中必须有,并且只能有一个主键
2、一张表中都应该有一个id字段,而且应该把id字段做成主键
create table t17(
id int primary key,
name char(16),
age int,
sex char(6)
)engine=innodb;
#联合主键
create table t19(
ip char(15),
port int,
primary key(ip,port)
);
auto_increment注意点:
1、通常与primary key连用,而且通常是给id字段加
2、auto_increment只能给被定义成key(unique key,primary key)的字段使用。
create table t20(
id int primary key auto_increment,
name char(16)
)engine=innodb;
foreign key是一个比较有深度的约束。如果想深入了解:
https://blog.csdn.net/miaoqinian/article/details/80252715
六、修改表
1. 修改表名ALTER TABLE 表名 RENAME 新表名;
2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
3. 删除字段
ALTER TABLE 表名 DROP 字段名;
4. 修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
七、复制表
复制表结构+记录 (key不会复制: 主键、外键和索引)
create table new_service select * from service;
只复制表结构
create table new1_service select * from service where 1=2;
因为条件为假,查不到任何记录
复制表结构也可以使用下面的方法:
八、删除表
DROP TABLE 表名;