**資料定義語言**（data definition language，DDL）屬於DBMS語言的一種，用於明確定義概念綱要(conceptual schemas)及內部綱要(internal schemas)，DBMS內的DDL編譯器(compiler)能夠處理DDL，識別綱要建構物(schema constructs)的描述(description)並加以存入DBMS目錄中的綱要描述(schema description)。
為SQL語言集中負責資料結構定義與資料庫物件定義的語言，由`CREATE`、`ALTER`與`DROP`三個語法所組成，最早是由Codasyl（Conference on Data Systems Languages）資料模型開始，現在被納入SQL指令中作為其中一個子集

語法結構
----

目前大多數的DBMS都支援對資料庫物件的DDL操作，部份資料庫 (如 PostgreSQL) 可把DDL放在交易指令中，也就是它可以被撤回 (Rollback)。較新版本的DBMS會加入DDL專用的觸發程序，讓資料庫管理員可以追蹤來自DDL的修改。

### CREATE

CREATE 是負責資料庫物件的建立，舉凡資料庫、資料表、資料庫索引、預存程序、使用者函數、觸發程序或是使用者自定型別等物件，都可以使用 CREATE 指令來建立，而為了各式資料庫物件的不同，CREATE 也有很多的參數。

例如，CREATE DATABASE (建立資料庫) 的指令為：

```
CREATE DATABASE Sales
ON ( NAME = Sales\_dat, FILENAME = 'saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 )
LOG ON ( NAME = Sales\_log, FILENAME = 'salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )

```

其中的`ON`為資料庫檔案的宣告，而`LOG ON`為交易記錄檔的宣告。
若需要更進階的設定，則還有 `FOR` 和 `WITH` 以及 `COLLATE`等等。

又例如，CREATE TABLE (建立資料表) 的指令為：

```
CREATE TABLE [dbo].[PurchaseOrderDetail]
(
 [PurchaseOrderID] [int] NOT NULL REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID), -- 具參考完整性限制欄位
 [LineNumber] [smallint] NOT NULL,
 [ProductID] [int] NULL REFERENCES Production.Product(ProductID), -- 具參考完整性限制欄位
 [UnitPrice] [money] NULL,
 [OrderQty] [smallint] NULL,
 [ReceivedQty] [float] NULL,
 [RejectedQty] [float] NULL,
 [DueDate] [datetime] NULL,
 [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [DF\_PurchaseOrderDetail\_rowguid] DEFAULT (newid()), -- 具限制欄位，並有預設值
 [ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF\_PurchaseOrderDetail\_ModifiedDate] DEFAULT (getdate()), -- 具限制欄位，並有預設值
 [LineTotal] AS (([UnitPrice]\*[OrderQty])),
 [StockedQty] AS (([ReceivedQty]-[RejectedQty])),
CONSTRAINT [PK\_PurchaseOrderDetail\_PurchaseOrderID\_LineNumber] -- 主鍵宣告
 PRIMARY KEY CLUSTERED ([PurchaseOrderID], [LineNumber])
 WITH (IGNORE\_DUP\_KEY = OFF)
) 
ON [PRIMARY]

```

其中，每個欄位的格式都有定義，並且若有需要建立參考完整性的連結時，可以使用 `REFERENCES` 來宣告，主鍵則是用`PRIMARY KEY` 來宣告，計算型欄位(Computed Field)則是直接給定運算式等等，`CREATE TABLE` 指令很常用，但若設定起來會較為複雜，因此很多資料庫管理人員都會使用GUI工具來設計。

其他像是：

* CREATE INDEX：建立資料表索引。
* CREATE PROCEDURE：建立預存程序。
* CREATE FUNCTION：建立使用者函數。
* CREATE VIEW：建立檢視表。
* CREATE TRIGGER：建立觸發程序。

等等，都是使用來建立不同資料庫物件的指令。

### ALTER

`ALTER` 是負責資料庫物件修改的指令，相較於 `CREATE` 需要定義完整的資料物件參數，`ALTER` 則是可依照要修改的幅度來決定使用的參數，因此使用上並不會太困難，例如：

```
ALTER TABLE doc\_exa ADD column\_b VARCHAR(20) NULL ; -- 在資料表 doc\_exa 中加入一個新的欄位，名稱為 column\_b，資料型別為 varchar(20)，允許 NULL 值。
ALTER TABLE doc\_exb DROP COLUMN column\_b ; -- 在資料表 doc\_exb 中移除 column\_b 欄位。
alter table scm.scm\_d\_pp\_detail\_1h change column PP\_ID\_2H PP\_ID\_1H varchar(50) -- 列改名
alter table test modify address char(10) --修改表列类型

```

### DROP

DROP 則是刪除資料庫物件的指令，並且只需要指定要刪除的資料庫物件名稱即可，在 DDL 語法中算是最簡單的。

例如：

```
DROP TABLE myTable; -- 刪除 myTable 資料表。
DROP VIEW myView; -- 刪除 myView 檢視表。

```

DBMS語言
------

其他DBMS語言包括：

* 儲存定義語言(Storage Definition Language, SDL)
* 視野定義語言(View Definition Language, VDL)
* 資料操縱語言(Data Manipulation Language, DML)

參考資料
----

1. DDL
2. MySQL SQL Syntax （页面存档备份，存于）
3. Oracle® Database SQL Language Reference[]
4. Transact-SQL Reference （页面存档备份，存于）
5. PostgreSQL SQL Commands （页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
SQL |
| --- |
|  |
| 版本 | 
* SQL-86
* SQL-89
* SQL-92
* SQL:1999（英语：）
* SQL:2003（英语：）
* SQL:2006（英语：）
* SQL:2008（英语：）
* SQL:2011（英语：）
* SQL:2016（英语：）

 |
|  |
| 关键字 | 
* As（英语：）
* Case
* Create
* Delete
* From（英语：）
* Having（英语：）
* Insert
* Join
* Merge（英语：）
* Null
* Order by（英语：）
* Over
* Prepare（英语：）
* Select
* Truncate
* Union（英语：）
* Update
* Where（英语：）
* With（英语：）

 |
|  |
| 相关 | 
* 埃德加·科德
* 关系数据库

 |
|  |
| ISO/IEC SQL部分 | 
* Framework（英语：）
* Foundation（英语：）
* Call-Level Interface（英语：）
* Persistent Stored Modules（英语：）
* Management of External Data（英语：）
* Object Language Bindings（英语：）
* Information and Definition Schemas（英语：）
* SQL Routines and Types for the Java Programming Language（英语：）
* XML-Related Specifications（英语：）

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数据库管理系统（DBMS） |
| --- |
|  |
| 概念 | 
* 数据库
	+ 理論
* 数据模型
* 数据库存储结构（英语：）
* 关系 (数据库)
* 关系模型
* 分布式数据库
* ACID
	+ 原子性（英语：）
	+ 一致性
	+ 隔離性
	+ 持久性
* Null值
* 数据库规范化
* 數據庫完整性
* 實體完整性
* 參照完整性
* 关系数据库管理系统
* 主键
* 外键
* 代理键
* 超键
* 候选键
* 事务处理
* 增刪查改

 |
|  |
| 数据库组件 | 
* 触发器
* 视图
* 数据库表
	+ 
	+
* 指标
* 事务日志（英语：）
* 数据库事务
* Savepoint
* 并发控制
* 乐观锁
* 悲观锁
* 数据库索引
* 存储程序
* 資料庫分割（英语：）

 |
|  |
| SQL | 

|  |  |
| --- | --- |
| 分类 | 
* 数据查询语言（DQL）
* 資料定義語言（DDL）
* 資料操縱語言（DML）
* 資料控制語言（DCL）

 |
|  |
| 指令 | 
* SELECT
* INSERT
* UPDATE
* MERGE
* DELETE
* JOIN
* UNION
* CREATE
* DROP
* Begin work
* COMMIT
* ROLLBACK
* TRUNCATE
* ALTER

 |
|  |
| 安全 | 
* 
* 參數化查詢

 |

 |
|  |
| 实现 | 

|  |  |
| --- | --- |
| 类型 | 
* 关系数据库
* 面向文檔的數據庫
* 平面文件数据库
* Deductive（英语：）
* 維度化資料庫
* 階層式
* 图数据库
* NoSQL
* NewSQL
* 对象数据库
* 物件關聯式資料庫（英语：）
* Temporal
* XML資料庫（英语：）

 |
|  |
| 数据库产品 | 
* 对象型
	+ 对比
* 关系型
	+ 对比

 |
|  |
| 数据库组件 | 
* 数据查询语言
* 查詢最佳化器（英语：）
* 查詢計畫（英语：）
* 嵌入式SQL
* ORM
* LINQ
* 数据访问层
* ODBC
* OLE DB
* ADO
* ADO.NET
* JDBC
* PDO

 |

 |

 |


1. 1 2  Elmasri, R. & Navathe, S. B. (2017). Fundamentals of database systems. Hoboken, NJ: Pearson.