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命令。

posted @ 2021-02-27 15:48  deng-hui  阅读(266)  评论(0编辑  收藏  举报