DDL 数据定义语言
DDL是基于数据表级别的操作的统称,对数据表的 创建 删 改
- 删除
- drop – 删除表,记录日志
- truncate – 删除表中的全部数据,不删除表,不记录日志
- 修改
- alter – 针对表中的字段.及字段的属性
- add 添加列
- modify 修改列的属性
- drop 删除列
- alter – 针对表中的字段.及字段的属性
- rename – 给表重命名
- create – 创建新表
创建表
- create table
1 | create table 表名( |
- 子查询创建表
1 | create table 表名 as 查询语句 |
- 列的类型
- varchar ,目前支持,但是不保证以后还 支持
- varchar2 (长度) 可变长度字符串
- hello varchar2(10) 占五个字符串
- char(长度) 固定长度的字符串
- char(10) 占十个字符,不足用空格补全
- number (总长度,小数长度) 数字类型— 小数长度不能大于总长度
- date 年月日时分秒
- timestamp 时间戳, 比date类型更精确
1 | select current_date from dual; |
结果格式:
2019-04-17 11:59:41
1 | select current_timestamp from dual; |
结果格式:
2019-04-17 12:01:06.832000
更加详细, 精确到了秒的下一级
修改表
- 修改表名
1 | alter 旧表名 to 新表名; |
添加列
1
alter table 表名 add 列名 列类型
添加多列
1 | alter table add( |
- 修改列的属性
1 | alter table 表名 modify 列名 新属性 |
- 修改列名
1 | alter table 表名 rename column 旧列名 to 新列名 |
删除
- 删除表
1 | drop table 表名; |
- 删除列
1 | alter table 表名 drop column 列名; |
表的五大约束
- 单表 有四个约束
- 多表有 一个约束
单表约束
- 主键约束 – primary key
- 主键约束默认不能为空,主键必须唯一
- 非空约束 – not null
- 唯一约束 – unnique
- 检查约束 – check
其中候选码可以为空,但是不能重复
例:
1 | create table student ( |
插数据:
验证主键约束– 不能为空,必须唯一
- 如果主键出现重复,报错,违反了唯一约束
- 唯一约束: 违反,sql失败
- 非空约束: 违反非空约束,sql失败
- 检查约束 必须满足检查条件,否则sql失败
在mysql中,检查约束是可以使用的,但是mysql直接忽略了,写不写结果一样
多表约束
多表约束-即-主外键约束,很多时候数据库中的两张表是关系的,比如 商品分类表和商品表,就可以设计成多表约束
我们希望,商品表中的商品一一对应着商品分类表中的 商品分类,于是我们让 商品分类的主键 和 商品表中 所属分类的cid建立起主外键约束
这样就得到了一条特性,往辅表中插入数据的前提是 插入的外键值,必须存在于主表中, 不然我们理解成, 一个没有所属分类的商品是没有意义的
实验:
– 第一步,创建两张表(没有外键关联)1
2
3
4
5
6
7
8
9
10
11
create table category(
cid number primary key ,
cname varchar2(20)
);
create table product(
pid number primary key ,
pname varchar2(20),
cno number
);
– 第二步: 添加数据,即便是 1!=11 也不出错
1 | -- 假设我们的商品分类表中 cid ==1 为 手机 |
– 先把不满足的数据删除1
2delete product where pid =1;
delete from product where pid =1;
— 第三步, 添加外键约束
1 |
|
– 关联成功后, 表中的数据被外键关联,无法被删除
1 | -- 不能删除主表 |
级联删除
在商品分类表和商品表的建立外键关联后,我们提出需求,想在删除商品分类后,该分类下的商品一同被删除,于是我们建立级联删除的关系
修改商品表,添加新的属性
on delete cascade(瀑布级联)
1 | alter table 商品表 add foreign key(商品表的cno) reference 商品分类表(主键) on delete cascade; |
现在删除 主表中的数据,就可以级联删除
总结
级联操作,大部分是针对主表进行约束,而针对从表只有一条约束,只要是存在级联关系,从表中想添加数据,必须满足 外键值存在于主表当中
在不添加级联操作之前,一旦建立主表和从表一旦建立起主/外键约束,主表会受到如下约束:
- 不能直接删除主表
- 不能删除某行
- 可以强制删除主表 – cascade constraints
强制删除主表,做两件事,1. 删除约束 2. 删除主表
添加级联操作之前,一旦建立主表和从表一旦建立起主/外键约束,主表会受到如下约束:
- 不能删除主表
- 能删除某行,并且从表从的拥有相应外键的行被级联删除
两种添加主键约束的方式:
1 |
|
添加主键约束(或者候选码约束)
三种添加主键约束的表达式
1 | 直接写: |
多扯一嘴 关于constraint(约束)关键字的单复数, 在添加约束(主键约束,候选码约束)取别名时,使用的是单数情况,因为就一个, 但是在强制删除表时 cascade constraints 使用的是复数
DML
针对表中数据的操作
- insert
- uptate
- select
- delete
关于insert
1 | 用法1: |
关于update
1 | update 表名 set 列名 = 列的值 where ename = 'XXX' |
关于delete
1 | delete from 表名 [where 条件]; |
delete & truncate的区别
- delete是DML data manipulation language 数据操作语言
- 支持事务操作,删除一行
- truncate 属于DDL ,数据库定义语言
- 不支持事务. 删除表中的全部数据,不记录日志