SQL 有四大分类:
- DDL(数据定义语言)负责处理表格的「结构」。
- DML(数据操作语言)负责处理表格的「资料」。
- DCL(数据控制语言)负责处理「权限」。
- TCL(事务控制语言)负责处理事务。
本文讲解其中非常重要的一类——DDL(Data Definition Language,数据定义语言)。
DDL 总共有五个指令:CREATE、ALTER、TRUNCATE、DROP、RENAME。
DDL 是什么? 跟 DML 有什么不同?
简单来说,DDL 就是用来处理表格「结构」的指令。
什么是表格的结构? 就是有几个字段、字段叫什么名字、每个字段的数据类型是什么这些事情。
我们用一个例子来说明。
假设有一张 employee 表格,长这样:
| ID | 名称 | 部门 | 薪资 |
|---|---|---|---|
| 1 | 爱丽丝 | HR | 50000 |
| 2 | 鲍勃 | IT | 60000 |
这张表格有两个面向:
- 结构面 :有 4 个字段(ID、Name、Department、Salary),每个字段有各自的数据型态。
- 资料面 :有 2 笔资料(Alice 和 Bob 的纪录)。
如果你要「新增一个字段」或「把整张表格删掉」,这就是在修改结构,属于 DDL。
如果你要「把 Bob 的薪水从 60000 改成 70000」,这就是在操作数据,属于 DML。
DDL 指令的重要特性:自动提交(Auto Commit)
在学五个指令之前,有一个很重要的观念要先知道。
什么是 COMMIT 和 ROLLBACK
在数据库的世界里,你对数据做的每一个操作,并不会马上永久储存。
这些操作会先暂时存在一个「临时事务区」里,等你确认没问题之后,再用 COMMIT(提交)指令把修改永久写进数据库。
如果你做到一半发现改错了,还可以用 ROLLBACK(回滚)指令,把所有还没提交的修改通通撤销,回到上一次 COMMIT 的状态。
你可以把它想像成在用 Git:
你在本地改了一堆代码,这些修改还只是停留在工作目录里,还没有被记录下来。
当你执行 git commit,修改就被正式提交了,这就是 COMMIT。
但如果你改到一半发现改错了,可以用 git checkout 把文件还原回上一次 commit 的状态,这就是 ROLLBACK。
DDL 的自动提交
但 DDL 指令比较特别,它执行后会自动提交(Auto Commit)。
| 类型 | 执行后能否 ROLLBACK | 需要手动 COMMIT 吗 |
|---|---|---|
| DML | 可以,还没 COMMIT 前都能复原 | 需要,要自己按「储存」 |
| DDL | 不行,执行就生效 | 不需要,系统自动帮你“储存” |
也就是说,DDL 执行后会自动提交,修改立即生效并持久化,修改立刻生效并且永久储存, 无法通过 ROLLBACK 撤销 。
所以在执行 DDL 指令之前,一定要想清楚再动手,特别是 TRUNCATE 和 DROP 这种破坏性的操作。
CREATE——建立新表格
CREATE 是用来「从零开始建立一张表格」的指令。
假设现在库里什么都没有,我想建立一张有 4 个字段 employee 表格。
语法长这样:
CREATE TABLE employee ( ID NUMBER, Name VARCHAR2(50), Department VARCHAR2(50), Salary NUMBER );
执行之后,数据库就会多出一张叫做 employee 的表格,里面有 4 个字段。
| ID | 名称 | 部门 | 薪资 |
|---|---|---|---|
为什么 CREATE 是 DDL 指令? 因为它在定义表格的结构:有几个字段、字段叫什么、数据型态是什么。
这些全部都是结构层面的事情。
ALTER——修改现有表格的结构
假设你已经建好了 employee 表格,但后来发现少了一个 Gender 字段。
这时候你不需要把表格删除重建,只要用 ALTER 就可以了。
ALTER 可以做三件事:
新增字段
ALTER TABLE employee ADD (Gender VARCHAR2(10));
这样 employee 表格就会从 4 个字段变成 5 个字段。
| ID | 名称 | 部门 | 薪资 | 性别 |
|---|---|---|---|---|
| 1 | 爱丽丝 | HR | 50000 | |
| 2 | 鲍勃 | IT | 60000 |
删除字段
ALTER TABLE employee DROP COLUMN Gender;
如果某个字段不需要了,可以用这个方式把它移除。
| ID | 名称 | 部门 | 薪资 |
|---|---|---|---|
| 1 | 爱丽丝 | HR | 50000 |
| 2 | 鲍勃 | IT | 60000 |
修改字段的数据类型
ALTER TABLE employee MODIFY (Name VARCHAR2(100));
例如原本 Name 栏位最多只能存 50 个字符,现在想改成 100 个字符。
不管是新增、删除还是修改字段,ALTER 都是在动表格的结构,所以它也是 DDL 指令。
TRUNCATE——清空表格里的所有数据
TRUNCATE 的作用是「把表格里的数据全部删光,但保留表格本身」。
语法很简单:
TRUNCATE TABLE student;
我们用一个例子来看。
假设有一张 student 表格:
| ID | 名称 |
|---|---|
| 1 | 爱丽丝 |
| 2 | 鲍勃 |
| 3 | 卡萝尔 |
执行 TRUNCATE TABLE student; 之后,表格会变成:
| ID | 名称 |
|---|---|
资料全部不见了,但表格还在。
你之后还是可以新增数据、新增字段,做任何操作,因为表格本身并没有被删除。
要特别注意的是,TRUNCATE 是 DDL 指令,所以它会自动提交, 执行后无法回滚。
在按下 Enter 之前,请务必确认你真的要清空这张表格。
TRUNCATE 和 DELETE 有什么不同?
看到这里你可能会想:「等一下,DML 里面不是也有一个 DELETE 指令可以删资料吗? 那它跟 TRUNCATE 差在哪?」
确实,DELETE 也可以删除表格里的数据,但两者的运作方式完全不同。
DELETE 是一条一条删除数据,而且可以加上 WHERE 条件,只删除符合条件的特定几条。
例如只删除名字是 Alice 的那笔纪录:
DELETE FROM student WHERE Name = ‘Alice’;
而 TRUNCATE 是一口气把整张表格的数据全部清掉,没办法指定条件。
另外,因为 DELETE 是 DML 指令,执行后还可以用 ROLLBACK 来撤销。
但 TRUNCATE 是 DDL 指令,执行后就自动提交了,完全没有撤销的机会。
| 比较项目 | TRUNCATE(DDL) | 删除(DML) |
|---|---|---|
| 删除范围 | 只能清空全部资料 | 可以用 WHERE 指定条件 |
| 执行速度 | 较快 | 较慢(逐笔处理) |
| 能否 回滚 | 不能(Auto Commit) | 可以(还没 COMMIT 前都能恢复) |
| 表格结构 | 保留 | 保留 |
DROP——把整张表格彻底删除
DROP 和 TRUNCATE 很像,但更加彻底。
语法也很简单:
DROP TABLE student;
同样用 student 表格来举例。
执行 DROP TABLE student; 之后,不只数据没了,连表格本身、索引、所有相关的东西都会从数据库中完全消失 。
SQL 中 TRUNCATE 和 DROP 的差别
这两个指令很容易搞混,用一张表格来比较:
| 比较项目 | TRUNCATE | DROP |
|---|---|---|
| 资料 | 全部删除 | 全部删除 |
| 表格结构 | 保留 | 一并删除 |
| 执行后能否继续操作 | 可以,表格还在 | 不行,表格已经不存在了 |
| 能否复原 | 不能(Auto Commit) | 不能(Auto Commit) |
简单记:TRUNCATE 是「清空」,DROP 是「销毁」。
RENAME——重新命名表格
RENAME 是用来「把表格换一个名字」的指令。
语法就像一句英文:
RENAME student TO student_info;
执行之后,原本叫 student 的表格就会变成 student_info。
表格里面的字段和数据完全不会改变,只有名字不一样了。
为什么 RENAME 也是 DDL? 因为字段是跟着表格名称走的。
当你改了表格名称,等于改变了整个表格的结构定义,所以它也属于 DDL。
DDL 五个指令重点整理
这篇文章介绍了 DDL 的五个指令:
- CREATE:建立新的表格。
- ALTER:修改现有表格的结构(新增字段、删除字段、修改数据类型)。
- TRUNCATE:清空表格的所有数据,但保留表格结构。
- DROP:把整张表格从数据库中彻底删除。
- RENAME:重新命名表格。
最重要的一点是,DDL 指令都具有自动提交(Auto Commit) 的特性,一旦执行就无法复原。
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/2663.html
