SQL 有四大分類:
- DDL(資料定義語言)負責處理表格的「結構」。
- DML(資料操作語言)負責處理表格的「資料」。
- DCL(資料控制語言)負責處理「權限」。
- TCL(交易控制語言)負責處理「交易」。
這篇文章要來聊聊其中一個很重要的分類——DDL(Data Definition Language,資料定義語言)。
DDL 總共有五個指令:CREATE、ALTER、TRUNCATE、DROP、RENAME。
學完這篇,你就會知道什麼時候該用哪個指令,以及它們之間的差異。
DDL 是什麼?跟 DML 有什麼不同?
簡單來說,DDL 就是用來處理表格「結構」的指令。
什麼是表格的結構?就是「有幾個欄位」、「欄位叫什麼名字」、「每個欄位的資料型態是什麼」這些事情。
我們用一個例子來說明。
假設有一張 employee 表格,長這樣:
這張表格有兩個面向:
- 結構面:有 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)。
也就是說,你一執行 DDL 指令,系統就會自動幫你按下「儲存」,修改立刻生效並且永久儲存,完全沒有機會用 ROLLBACK 來復原。
所以在執行 DDL 指令之前,一定要想清楚再動手,特別是 TRUNCATE 和 DROP 這種破壞性的操作。
CREATE——建立新表格
CREATE 是用來「從零開始建立一張表格」的指令。
假設現在資料庫裡什麼都沒有,我想建立一張有 4 個欄位的 employee 表格。
語法長這樣:
CREATE TABLE employee (
ID NUMBER,
Name VARCHAR2(50),
Department VARCHAR2(50),
Salary NUMBER
);執行之後,資料庫就會多出一張叫做 employee 的表格,裡面有 4 個欄位。
為什麼 CREATE 是 DDL 指令?因為它在定義表格的結構:有幾個欄位、欄位叫什麼、資料型態是什麼。
這些全部都是結構層面的事情。
ALTER——修改現有表格的結構
假設你已經建好了 employee 表格,但後來發現少了一個 Gender 欄位。
這時候你不需要把表格砍掉重建,只要用 ALTER 就可以了。
ALTER 可以做三件事:
新增欄位
ALTER TABLE employee ADD (Gender VARCHAR2(10));這樣 employee 表格就會從 4 個欄位變成 5 個欄位。
刪除欄位
ALTER TABLE employee DROP COLUMN Gender;如果某個欄位不需要了,可以用這個方式把它移除。
修改欄位的資料型態
ALTER TABLE employee MODIFY (Name VARCHAR2(100));例如原本 Name 欄位最多只能存 50 個字元,現在想改成 100 個字元。
不管是新增、刪除還是修改欄位,ALTER 都是在動表格的結構,所以它也是 DDL 指令。
TRUNCATE——清空表格裡的所有資料
TRUNCATE 的作用是「把表格裡的資料全部刪光,但保留表格本身」。
語法很簡單:
TRUNCATE TABLE student;我們用一個例子來看。
假設有一張 student 表格:
執行 TRUNCATE TABLE student; 之後,表格會變成:
資料全部不見了,但表格還在。
你之後還是可以新增資料、新增欄位,做任何操作,因為表格本身並沒有被刪除。
要特別注意的是,TRUNCATE 是 DDL 指令,所以它會自動提交,一旦執行就無法復原。
在按下 Enter 之前,請務必確認你真的要清空這張表格。
TRUNCATE 和 DELETE 有什麼不同?
看到這裡你可能會想:「等一下,DML 裡面不是也有一個 DELETE 指令可以刪資料嗎?那它跟 TRUNCATE 差在哪?」
確實,DELETE 也可以刪除表格裡的資料,但兩者的運作方式完全不同。
DELETE 是一筆一筆刪除資料,而且可以加上 WHERE 條件,只刪除符合條件的特定幾筆。
例如只刪除名字是 Alice 的那筆紀錄:
DELETE FROM student WHERE Name = 'Alice';而 TRUNCATE 是一口氣把整張表格的資料全部清掉,沒辦法指定條件。
另外,因為 DELETE 是 DML 指令,執行後還可以用 ROLLBACK 來反悔。
但 TRUNCATE 是 DDL 指令,執行後就自動提交了,完全沒有反悔的機會。
DROP——把整張表格徹底刪除
DROP 和 TRUNCATE 很像,但更加徹底。
語法也很簡單:
DROP TABLE student;同樣用 student 表格來舉例。
執行 DROP TABLE student; 之後,不只資料沒了,連表格本身、索引、所有相關的東西都會從資料庫中完全消失。
SQL 中 TRUNCATE 和 DROP 的差別
這兩個指令很容易搞混,用一張表格來比較:
簡單記: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)的特性,一旦執行就無法復原。
所以在使用 TRUNCATE 和 DROP 這類破壞性指令時,一定要特別小心。