MySQL中的DDL和DML
先看看表中的数据都有一些什么内容。
1.数据类型
表里的数据,都需要有一个确切的数据类型。先来看看表支持哪些数据类型吧?(以下列举常用的)
int、bigint、float、double、char、varchar、date、datetime,BLOB、CLOB
-
int和bigint是整型数据,int为4个字节,bigint是长整型,为8个字节;
-
float和double是浮点型数据,float为4个字节,double为8个字节,使用格式为(总长度,小数点后的长度);
-
char和varchar都是存储字符串的,但是char是不可变长的,varchar是可变长的(前提是不超过定义的长度);
-
date和datetime都是日期,date格式为年:月:日;datetime多了时间,为年:月:日 时:分:秒;
-
BLOB是二进制大对象,如图片、视频等流媒体信息;
-
CLOB是字符串大对象,最大可以存储4GB。
2.约束
约束是为了保证表数据的完整性、有效性和安全性。
就像你注册一个账号时,对你所填的信息是有要求的,比如密码不能为空等等要求。这些在数据库中都是使用约束来完成。
MySQL中有四种约束:
-
主键约束(primary key):被主键约束修饰的字段值,不能为空,且不能重复。
-
唯一约束(unique):被唯一约束修饰的字段值,可以为空,并且可以是多个NULL,但是其它值不能重复。
-
非空约束(not null):被非空约束修饰的字段值不能为空。
-
外键约束(foreign key):与别的表有关。
(在下述建表语句中会更详细的介绍约束的用法)
3.创建表及删除表
表是数据库的基本单元,所有的数据都以表的形式创建。
所以我们首先要做的就是创建表:
create table tb_name
(
字段名 数据类型(长度)[约束] [default],
......
)
如:
在创建一张表时,可能数据库已经存在了,所以在创建表前可以先做一个判断(下述第一行)
#删除表
drop table tb_name;
#可以先判断一下是否已经存在表,如果存在就删除原来的
drop table if exists student;
#建表
create table student
(
stu_no int(5) primary key,
stu_name varchar(10) not null,
stu_class int(2) unique,
stu_sex char(1),
stu_grade double(4,2)
);
上述创建表,使用了数据类型和关键字。
主键:
为什么需要主键呢?
用于唯一的标识一行数据。如两个相同名字,相同出生年月日,相同性别的人,但是可以使用身份证取唯一的区分两个人。
unique和not null,可同时定义多个字段,primary key只能有一个。但是可以多个字段联合起来作为主键,如primry key(stu_no,stu_name),这种称为复合主键,但是一般不建议这样使用。一个字段的主键称为单一主键,建议使用单一主键。
primary key不仅仅在字段后面使用,也可以在最后使用:
create table student
(
stu_no int(5),
stu_name varchar(10) not null,
stu_class int(2) unique,
stu_sex char(1),
stu_grade double(4,2),
primary key(stu_no)
);
主键的其它点:
主键还可以分为自然主键和业务主键,业务主键是和业务有关系的字段作为主键,如身份证号,银行卡号,但是不建议使用业务主键,因为有时候业务可能会发生改变,主键就需要随之改变,但是很多时候是不能修改的,修改很难避免重复的问题。一般使用自然主键,即自定义一个字段作为主键,来标识一行数据。如1,2,3...这种简单的数字。
自增:
MySQL中支持数据自增,即auto_increment,一般与主键联合在一起使用。如stu_no int(5) primary key auto_increment
,以1开始,以1递增(上条数据+1),可修改步长。
unique:
unique也可以放在最后:
create table student
(
stu_no int(5) primary key auto_increment,
stu_name varchar(10) not null,
stu_class int(2) unique,
stu_idcard int(13) unique,
stu_sex char(1),
stu_grade double(4,2)
);
create table student
(
stu_no int(5) primary key,
stu_name varchar(10) not null,
stu_class int(2),
stu_idcard int(13),
stu_sex char(1),
stu_grade double(4,2),
unique(stu_class,stu_idcard)
);
注意:上述两种创建的唯一约束是不一样的。
- unique(stu_class,stu_idcard):表示只有stu_class和stu_idcard两个值绑定在一起不能重复,如1班,1111111和1班,2222222是不一样的;
- 而stu_class int(2) unique,stu_idcard int(13) unique是任何一个字段都不能重复,1班,1111111和1班,2222222是不允许的,因为stu_class重复了。
外键:
先来看两张表:
student表:
name varchar(10) | classNo int(2) | sex char(1) |
---|---|---|
Tom | 1 | 男 |
Jerry | 2 | 男 |
class表:
class_no int(2) | class_name varchar(3) |
---|---|
1 | 一班 |
2 | 二班 |
在class表中的class_name字段取值取的是student表中的classNo字段中的值,此时,class_name就是外键。
如何定义一个外键呢?(假设student表已经创建好了)
create table class
(
class_no int(2) primary key auto_increment, #数据长度必须与引用字段的长度一致
class_name varchar(3),
#定义外键
foreign key(class_no) references student(classNo);
)
注意:
- 被引用的字段必须具有唯一性;
- 外键字段取值只能是主表中被引用的字段中存在的值,但是外键字段值可以为NULL;
- 要删除主表中的数据,必须先删除外键表中的数据。
4.表中插入数据
insert into tb_name 字段1,... values (值1,...);
#字段和值必须一一对应;
#如果是自增的值,可以填NULL,那么此时就会在上一条数据基础上+1,也可以指定值。
#可以省略指定的字段不写,即代表所有的字段
insert into tb_name values (值1,...);
#也可同时插入多个值
insert into tb_name 字段1,... values (值1,...),(值1,...),...;
默认值:
有些数据可能在一开始就设置了默认值,如:
class_name int(3) default '一班'
创建表时,如果指定了默认值,插入数据就算没有指定该值,也会自动的生成默认值。但是可以重新复制,覆盖默认值。
表的复制:
可以使用insert+select实现表的复制:
insert into new_tb_name as (select * from old_tb_name);
(但是必须要保证两张表的字段个数是一样的)
5.更新表中数据
update tb_name set 字段1 = 值1,... [where 条件];
#如果没有条件的话,会修改整张表中的数据,一定要注意添加条件,修改了是不可逆的。
6.删除数据
delete from tb_name [where 条件];
##如果没有条件,会删除整张表,更加要谨慎了!!!
如果是一张很大的表,delete的执行效率是很慢的,可能好好多分钟,因为delete是不会释放表真正的空间的。
还有另外一个删除:truncate:
truncate table tb_name;
truncate删除一张表,会永久的截断,不可恢复丢失的数据。(慎用!)
该文章中没有涉及到DML中的alter,因为在实际开发中,一张表设计好了,很少会修改表的结构,为了减负,就不在此赘述了。
可以直接百度MySQL的alter命令。