第四篇:数据定义语言DDL

数据定义语言主要解决数据库的创建及删除和表格的结构的问题。其中,库和表格的操作都是创建,修改和删除。但是,为了更加清楚地显示表格的结构,这里还将对MySQL的常见数据形式以及常见约束进行说明。

Part 1:数据库的管理

数据库的主要操作依然是创建,删除,修改。

数据库的创建的语法如下:
creat database 数据库名;

备注:数据库名不可与已经有的数据库名重复。
为了解决这个问题,创建如下的格式:
creat database if not exists 数据库名;
例1:创建数据库books:

creat database if not exists books;

数据库的修改:原则上一般不修改数据库,因为可能造成数据的丢失等问题,所以如果想修改的话,直接创建一个新的数据库即可。

数据库的删除的语法如下:
drop database 数据库名;
例2:删除数据库books:

drop database books;

Part 2:常见的数据类型

这一部分主要总结数据库的常见的数据类型,为表的结构打下基础。常见的数据类型主要包括以下几种:

  1. 数值型:整型+小数型
  2. 字符型
  3. 日期型

第一部分:数值型

数值型包括整型和小数型。先从整型说起。
tinyint 1个字节
smallint 2个字节
mediumint 3个字节
int 4个字节
bigint 8个字节

备注:

  1. 一般情况下,用int足够应对对整数的要求;如果数值超过了最大长度,那么就会将这个数值设置为临界值。
  2. 在创建表格时,设置的int的不同类型,都是有符号的数字,也就是可以表示负数;如果需要设置为无符号的数字的话,需要在不同类型的int后加上关键字unsigned.
  3. 一般int的长度会根据上面的不同类型来默认设置,如果需要强制设置长度的话,使用int(6)这种格式进行设置,其中6表示这种类型想要设置的长度。
  4. 如果需要在表格中设置定宽的values的话,需要在int后unsigned前加入zerofill这个关键字。

小数型:
小数型包含两种:浮点型和定点型。
浮点型:float(M,D), double(M,D)
其中,D表示小数点后面的小数的宽度,如果不够,补0;如果超过,则四舍五入;
M表示整数+小数的总长度,如果不写M和D的时候,插入什么都行;
定点型:dec(M,D),decimal(M,D)
其中,D表示小数点后面的小数的宽度,如果不够,补0;如果超过,则报错;
M表示整数+小数的总长度,如果不写M和D的时候,M默认为10,D默认为0;

第二部分:字符型

较短的字符型采用char和varchar进行保存,较长的字符型数据使用text和blob进行保存。需要注意的是,blob保存的是2进制的数据。
1.char(M)表示长度为M个字符数的字符型,M的取值可以为1-255;
2.varchar(M)表示长度为M个字符数的字符型,M的取值可以为1-255;

备注:char和varchar的区别在于varchar可以灵活调用,使用M以内的任意长度的字符型,比较省空间;char设置的M个长度,调用的就是M长度的空间,不够灵活。此外,varchar()中的M不可省略,char()中的M可以省略,默认值为1.

3.enum()用于保存枚举;
4.set()用于保存集合。

第三部分:日期型

MySQL要求日期型的变量用单引号’引起来。
日期型主要有以下几种:

  1. date, 使用4个字节, 最小时间:1000-01-01, 最大时间:9999-12-31;
  2. datetime, 使用8个字节,最小时间:1000-01-01 00:00:00,最大时间:9999-12-31 23:59:59;
  3. timestamp, 使用4个字节,最小时间:19700101 080001, 最大时间:2038年的某个时刻;timestamp受时区的影响;
  4. time,使用3个字节,最小时间:-838:59:59,最大时间:838:59:59
  5. year,使用1个字节,最小时间:1091,最大时间:2155;

Part 3:常见的约束总结

为了保证表格中的数据的稳定性和有效性,这里创建了约束的做法。
约束可以分为以下6种:

  1. 非空约束:该字段名下必须有内容;
  2. 默认约束:该字段名存在默认值;
  3. 主键约束:该字段名下的值不可以为空,并且不能重复;
  4. 唯一约束:该字段名下的值可以为空,但是不能重复;
  5. 检查约束:MySQL中不支持;
  6. 外键约束:限制两个表之间的关系,用于引用对方表格中的某些信息;

添加约束的时机:

  1. 创建表格时;
  2. 修改表格时;

按照添加的约束的作用范围可以分为:

  1. 列级约束:都可以,但是外键约束无效果;
  2. 表级约束:不可以加非空约束和默认约束,其余约束可以写;

    备注:列级约束主要写在字段名之后即可,表级约束写在所有的列级约束之后,用于关联不同表格之间的关系;

类型1:创建表格时添加列级约束
例3:在学生数据库student中创建表stuinfo:

creat database student;     
use student;    
creat table stuinfo(     
    id int primary key, # 其中id表示学号,由于学号不能是重复,也不能缺省,定义学号为主键约束;
    stuName varchar(20) not null; # 其中stuName表示学生的姓名,由于不能缺省,可以重复,所以为非空约束;    
    gender char(1) check(gender = '男' or gender = '女'), # 其中性别是只有两种选项的字符,所以可以设置为检查约束;   
    seat_id int unique, #其中seat_id表示座位号,是不可重复,但是可以空缺的,所以设置为唯一性约束;     
    major_id int references major(id) # 其中major_id表示专业号码,类型为int,需要借助于专业表major来判断具体是什么单位;    
);

备注:创建表格的时候,最后一行不需要加,号;

类型2:创建表格时添加表级约束
例4:在学生数据库student中创建表stuinfo:

creat database student;     
use student;    
creat table stuinfo(     
    id int, 
    stuName varchar(20),    
    gender char(1), 
    seat_id int,     
    major_id int,
    # 下面添加表级约束
    constraint pk primary key(id),
    constraint uq unique(seat_id),
    constraint ck check(gender = '男' or gender = '女'),
    constraint fk_stuinfo_major foreign key(majorid) references major(id)   
);

类型3:修改表格的时候添加列级约束
修改表格的时候,添加列级约束的语法如下:
alter table 表名 modify column 字段名 约束类型;
例5:将学生信息表stuinfo中学生姓名stuName修改为非空约束:

alter table stuinfo modify column stuName varchar(20) not null;

例6:将学生信息表stuinfo中学生年龄age修改为默认约束,默认18岁:

alter table stuinfo modify column age int default 18;

例7:将学生信息表stuinfo中学生学号id修改为主键约束:

alter table stuinfo modify column id int primary key;

例8:将学生信息表stuinfo中学生座位号seat_id修改为唯一约束:

alter table stuinfo modify column seat_id int unique;

备注:修改表格时,只能添加这4种表级约束;

类型4:修改表格的时候添加表级约束
修改表格的时候,添加表级约束的语法如下:
alter table 表名 modify add constraint 约束名 约束类型(字段名);
例9: 将学生信息表stuinfo中学生学号id修改为主键约束:

alter table stuinfo add primary key(id);

例10:将学生信息表stuinfo中学生座位号seat_id修改为唯一约束:

alter table stuinfo add unique(seat_id);

例11:将学生信息表stuinfo中学生专业号major_id修改为外键约束:

alter table stuinfo add foreign key(major_id) references major(id);

补充:删除约束指的是,将约束变为之前的样子即可,就是上述添加约束的逆过程。
例12:删除学生信息表stuinfo中学生姓名stuName的非空约束:

alter table stuinfo modify column stuName varchar(20) null;

例13:删除学生信息表stuinfo中学生年龄age的默认约束:

alter table stuinfo modify column age int;

例14:删除学生信息表stuinfo中学生学号id的主键约束:

alter table stuinfo drop primary key;

例15:删除学生信息表stuinfo中学生座位号seat_id的唯一约束:

alter table stuinfo drop index seat_id;

例16:删除学生信息表stuinfo中学生专业号major_id的外键约束:

alter table stuinfo drop foreign key majpr_id;

备注:主键和唯一键的区别:
主键是唯一的,不可以为空,每个表格中至多1个,可以组合,但不推荐;
唯一键是唯一的,但是可以空,每个表格中可以有很多个,可以组合,但不推荐。

Part 4:表格的管理

类似于数据库的管理,表格的管理主要是添加,修改,删除,不过还多了一个复制。

表格的添加

表格的创建的语法结构如下:
creat table 表名(
字段名 字段的类型 字段的约束,
字段名 字段的类型 字段的约束,

);

例17: 创建一个表book:

create table book(
    id int,
    bname varchar(20),
    author_id int,
    publish_date Datetime
);

表格的修改

类型1:修改字段名
语法:alter table 表名 change column 旧字段名 新字段名 类型;

备注:由于有了类型,这个语法也可以更新字段的类型。
例18:将表格book中的发布日期修改为pub_date:

alter table book change column publish_date pub_date;

类型2:修改字段的类型或者约束
语法:alter table 表名 modify column 字段名 类型名;
例19:将表格book中的发布日期publish_date的类型修改为日期戳:

alter table book modify column publish_date timestamp;

类型3:添加新字段
语法:alter table 表名 add column 字段名 类型名;
例20:在表格book中添加新的字段price,类型为double;

alter table book add column price double;

类型4:删除字段
语法:alter table 表名 drop column 字段名;
例21:删除表格book中的字段price:

alter table book drop column price;

类型5:修改表名
语法:alter table 旧表名 rename to 新表名;
例22:将表格book改名为books:

alter table book rename to books;

表格的删除

语法:drop table if exists 表名;

表格的复制

表格的复制存在两种:

  1. 表格结构的复制;
  2. 表格结构+内容的复制;

表格结构的复制的语法:
create table 新表名 like 旧表名;
这种复制只有表格的架构,没有表格的内容;

表格内容+结构的复制语法:
create table 新表名 select * from 旧表名;
这种复制方法能够将旧表格的所有内容都复制过来。

复制表格结构+部分内容的语法:
create table 新表名 select * from 旧表名 where 筛选条件;
先筛选后复制。



本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!