1.创建表 (建表属于DDL语句)
语法格式
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
);
表名:建议以t_ 或者 tbl_ 开始,可读性强。见名知意。
字段名:见名知意。
表名和字段名都属于标识符。
创建一个学生表
学号、姓名、性别、年龄、邮箱地址
create table t_student(
no int,
name varchar(32),
sex char(1),
age int(3),
email varchar(255)
);
快速创建表
原理:将一个查询结果当作一张表新建,这样可以完成表的快速复制,表创建出来同时表中的数据也存在了。
create table emp2 as select * from emp;
2.关于MySQL中的数据类型
varchar(最长255)
可变长度字符串。
比较智能,节省空间。
会根据实际的数据长度动态分配空间。
优点:节省空间
缺点:需要动态分配空间,速度慢
char(最长255)
定长字符串。
不管实际的数据长度是多少。
分配固定长度的空间去存储数据。
使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快
缺点:使用不当可能会导致空间的浪费
int(最长11)
数字中的整数型。等同于java的int。
bigint
数字中的长整型。等同于java的long。
float
单精度浮点型数据。
double
双精度浮点型数据。
date
短日期类型。
datetime
长日期类型。
clob
字符大对象。
最多可以存储4G的字符串。
比如:存储一篇文章,存储一个说明。
超过255个字符的都要采用CLOB字符大对象来存储。
Character Large OBject : CLOB
blob
二进制大对象。
专门用来存储图片、声音、视频等流媒体数据。
往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,需要使用IO流才行。
Binary Large OBject : BLOB
3.增加、修改、删除表数据
插入insert (插入属于DML语句)
语法格式
insert into 表名 (字段名1, 字段名2, 字段名3 ...) values (值1, 值2, 值3 ...);
// 字段名和值要一一对应
注:insert语句但凡执行成功,那么必然会多一条记录。
没有给其他字段指定值的话,默认值是NULL。
insert语句中的“字段名”省略的话,等于都写上了,values后的所有值也要都写上。
插入日期
insert into t_student(id, name, birth) values (1, 'zhangsan', str_to_data('01-10-2000' , '%d-%m-%Y'));
注:如果提供的日期字符串是 %Y-%m-%d 这个格式,str_to_date函数就不需要了。
插入多条数据
insert into 表名 (字段名1, 字段名2) values (), (), ();
修改update (修改属于DML语句)
语法格式
update 表名 set 字段名1=值1 , 字段名2=值2 , 字段名3=值3 ... where 条件;
注:没有条件限制会导致所有数据全部更新。
删除delete (删除属于DML语句)
语法格式
delete from 表名 where 条件;
注:没有条件限制会导致整张表的数据全部删除
删除表
drop table t_student; // 当这张表不存在时候会报错
drop table if exists t_student; // 如果这张表存在则删除
4.约束
约束的作用:保证表中数据的完整、有效。
非空约束
非空约束not null约束的字段不能为NULL。
create table t_vip(
id int,
name varchar(255) not null
);insert into t_vip (id) values (1);
ERROR 1364 (HY000) : Field 'name' doesn't have a default value
唯一性约束
唯一性约束unique约束的字段不能重复,但是可以为NULL。
create table t_vip(
id int,
name varchar(255) unique,
email varchar(255)
);insert into t_vip(id,name,email) values (1,'zhangsan','[email protected]');
insert into t_vip(id,name,email) values (2,'zhangsan','[email protected]');
ERROR 1062 (23000) : Duplicate entry 'zhangsan' for key 'name'
两个字段联合唯一
create table t_vip(
id int,
name varchar(255),
email varchar(255),
unique (name,email) // name和email两个字段联合起来唯一
);
注:约束直接添加到列后面的叫做列级约束;没有添加在列的后面,这种约束被称为表级约束。
在MySQL中,如果一个字段同时被not null 和 unique约束的话,该字段自动变成主键字段。
主键约束
主键字段:添加了主键约束的字段。
主键值:主键字段中的每一个值都叫做主键值。
建议使用int bigint char等类型,不建议使用varchar。主键值一般都是数字,一般都是定长的。
主键作用:主键值是每一行记录的唯一标识;任何一张表都应该有主键,没有主键表无效。
主键特征:not null + unique (主键值不能是NULL,同时也不能重复)
一个表中主键约束只能添加一个。
添加主键约束(一个字段作主键为单一主键)
create table t_vip(
id int primary key, // 列级约束
name varchar(255)
);或
create table t_vip(
id int,
name varchar(255),
primary key(id) // 表级约束
);
多个字段联合起来添加主键约束(复合主键)
create table t_vip(
id int,
name varchar(255),
email varchar(255),
primary key(id,name)
);
主键除了单一主键和复合主键之外,还可以分为:
自然主键:主键值是一个自然数,和业务没关系。
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。
在实际开发中使用自然主键比较多,因为主键只要做到不重复就行,不需要有意义。
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动时,可能会影响到主键值,所以业务主键不建议使用。
在MySQL中,有一种机制,可以帮助我们自动维护一个主键值:
create table t_vip(
id int primary key auto_increment, // 自增,从1开始,以1递增
name varchar(255)
);
外键约束
外键字段:添加了外键约束的字段。
外键值:外键字段中的每一个值。
create table t_class(
classno int primary key,
classname varchar(255)
);create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) references t_class(classno)
);
注: t_class是父表,t_student是子表
删除表时:先删子表,再删父表
创建表时:先创建父表,再创建子表
删除数据时:先删除子表,再删除父表
插入数据时:先插入父表,再插入子表
子表中的外键引用的父表中的某个字段,被引用的这个字段不一定是主键,但至少具有unique约束。
外键值可以为NULL。