# DDL 与 DML

URL: https://caijiao.org/postgresql/basic/objects/ddl-dml
Source: docs/postgresql/basic/objects/ddl-dml.md
Description: 介绍 PostgreSQL 中的 DDL（数据定义语言）和 DML（数据操作语言），并讲解常用的 SQL 命令和操作。

## 数据定义语言（DDL）

DDL 用于定义和管理数据库中的结构性对象，如表、视图、索引等。

### 常用 DDL 操作

#### 创建数据库

```sql
CREATE DATABASE mydb;
````

#### 创建表

```sql
CREATE TABLE employees (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  hired_at DATE,
  salary NUMERIC(10, 2)
);
```

#### 修改表结构

* **添加列**：

```sql
ALTER TABLE employees ADD COLUMN department TEXT;
```

* **修改列类型**：

```sql
ALTER TABLE employees ALTER COLUMN salary TYPE DECIMAL(15, 2);
```

* **删除列**：

```sql
ALTER TABLE employees DROP COLUMN department;
```

#### 删除对象

* **删除表**：

```sql
DROP TABLE employees;
```

* **删除数据库**：

```sql
DROP DATABASE mydb;
```

### 常用数据类型

* **ENUM**：自定义枚举类型
* **ARRAY**：数组类型
* **JSONB**：二进制 JSON 类型，支持高效查询

## 数据操作语言（DML）

DML 用于处理数据库中的数据，包括插入、更新、删除和查询操作。

### 插入数据

```sql
INSERT INTO employees (name, hired_at, salary)
VALUES ('John Doe', '2024-04-01', 50000);
```

### 查询数据

```sql
SELECT * FROM employees;
SELECT name, salary FROM employees WHERE salary > 40000;
```

#### 条件查询

```sql
SELECT * FROM employees WHERE department = 'Sales';
```

#### 排序

```sql
SELECT * FROM employees ORDER BY salary DESC;
```

#### 聚合函数

* **COUNT**：计数
* **AVG**：平均值
* **SUM**：求和
* **MAX** / **MIN**：最大/最小值

```sql
SELECT department, AVG(salary) FROM employees GROUP BY department;
```

#### 连接查询

```sql
SELECT employees.name, departments.name 
FROM employees 
JOIN departments ON employees.department_id = departments.id;
```

### 更新数据

```sql
UPDATE employees SET salary = 55000 WHERE id = 1;
```

### 删除数据

```sql
DELETE FROM employees WHERE id = 1;
```

## 小结

DDL 和 DML 是 PostgreSQL 中最基本且最常用的 SQL 操作。通过 DDL 定义数据库结构，再使用 DML 对数据进行管理，完成各类应用场景的需求。
