Skip to content

DDL 数据定义语言

DDL(Data Definition Language)用于定义和管理数据库结构,包括数据库、表、索引等对象的创建、修改和删除。

一、数据库操作

1.1 创建数据库

sql
-- 基本语法
CREATE DATABASE [IF NOT EXISTS] database_name
    [CHARACTER SET charset_name]
    [COLLATE collation_name];

-- 示例:创建 UTF-8 编码的数据库
CREATE DATABASE IF NOT EXISTS demo_db
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_general_ci;
参数说明
IF NOT EXISTS数据库不存在时创建,避免重复创建报错
CHARACTER SET字符集,推荐使用 utf8mb4(支持 emoji)
COLLATE排序规则,utf8mb4_general_ci 不区分大小写

1.2 查看数据库

sql
-- 查看所有数据库
SHOW DATABASES;

-- 查看数据库创建语句
SHOW CREATE DATABASE demo_db;

-- 查看当前使用的数据库
SELECT DATABASE();

1.3 切换数据库

sql
USE demo_db;

1.4 删除数据库

sql
-- 删除数据库(危险操作!)
DROP DATABASE [IF EXISTS] demo_db;

⚠️ 警告DROP DATABASE 会删除数据库及其所有数据,生产环境慎用!

二、表操作

2.1 创建表

sql
CREATE TABLE [IF NOT EXISTS] table_name (
    column_name data_type [constraints] [COMMENT '注释'],
    ...
    [PRIMARY KEY (column_name)],
    [INDEX index_name (column_name)],
    [UNIQUE INDEX unique_name (column_name)]
) [ENGINE=engine_name] [CHARSET=charset_name] [COMMENT='表注释'];

完整示例:

sql
CREATE TABLE IF NOT EXISTS tb_user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    user_name VARCHAR(50) NOT NULL COMMENT '用户名',
    age INT COMMENT '年龄',
    email VARCHAR(100) UNIQUE COMMENT '邮箱',
    dept_id BIGINT COMMENT '部门ID',
    status TINYINT DEFAULT 1 COMMENT '状态:0-禁用 1-启用',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    deleted TINYINT DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
    INDEX idx_dept_id (dept_id),
    INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

2.2 常用数据类型

类型说明示例
整数
TINYINT微整型(1字节)状态标志(0/1)
INT整型(4字节)年龄、数量
BIGINT长整型(8字节)主键ID
小数
DECIMAL(M,D)精确小数DECIMAL(10,2) 金额
FLOAT单精度浮点不推荐用于金额
DOUBLE双精度浮点不推荐用于金额
字符串
CHAR(N)定长字符串手机号、身份证号
VARCHAR(N)变长字符串用户名、邮箱
TEXT长文本文章内容
日期时间
DATE日期生日
TIME时间营业时长
DATETIME日期时间创建时间
TIMESTAMP时间戳自动更新的时间

2.3 约束类型

约束说明示例
PRIMARY KEY主键,唯一标识每行id BIGINT PRIMARY KEY
AUTO_INCREMENT自增id BIGINT AUTO_INCREMENT
NOT NULL非空user_name VARCHAR(50) NOT NULL
DEFAULT默认值status TINYINT DEFAULT 1
UNIQUE唯一email VARCHAR(100) UNIQUE
COMMENT注释COMMENT '用户名'

2.4 查看表

sql
-- 查看当前数据库所有表
SHOW TABLES;

-- 查看表结构
DESC tb_user;
-- 或
DESCRIBE tb_user;

-- 查看建表语句
SHOW CREATE TABLE tb_user;

-- 查看表的详细信息
SHOW TABLE STATUS LIKE 'tb_user';

2.5 修改表结构

sql
-- 修改表名
ALTER TABLE old_table_name RENAME TO new_table_name;

-- 添加列
ALTER TABLE tb_user ADD COLUMN phone VARCHAR(20) COMMENT '手机号' AFTER email;

-- 修改列(类型、约束)
ALTER TABLE tb_user MODIFY COLUMN age TINYINT COMMENT '年龄';

-- 修改列名和类型
ALTER TABLE tb_user CHANGE COLUMN user_name username VARCHAR(50) COMMENT '用户名';

-- 删除列
ALTER TABLE tb_user DROP COLUMN phone;

-- 修改表注释
ALTER TABLE tb_user COMMENT = '用户信息表';

2.6 删除表

sql
-- 删除表(危险操作!)
DROP TABLE [IF EXISTS] tb_user;

-- 清空表数据(保留表结构)
TRUNCATE TABLE tb_user;

DELETE vs TRUNCATE 区别:

特性DELETETRUNCATE
类型DMLDDL
速度
事务可回滚不可回滚
自增ID不重置重置为1
条件删除支持 WHERE不支持

三、索引操作

索引是提升查询性能的关键,类似于书籍的目录。

3.1 索引类型

类型说明适用场景
PRIMARY KEY主键索引唯一标识每行
UNIQUE唯一索引不允许重复的值
INDEX普通索引加速查询
FULLTEXT全文索引文本搜索
COMPOSITE复合索引多列组合查询

3.2 创建索引

sql
-- 方式一:建表时创建
CREATE TABLE tb_user (
    id BIGINT PRIMARY KEY,
    user_name VARCHAR(50),
    email VARCHAR(100),
    UNIQUE INDEX uk_email (email),
    INDEX idx_user_name (user_name)
);

-- 方式二:ALTER TABLE 添加
ALTER TABLE tb_user ADD INDEX idx_age (age);
ALTER TABLE tb_user ADD UNIQUE INDEX uk_email (email);

-- 方式三:CREATE INDEX 添加
CREATE INDEX idx_status ON tb_user (status);
CREATE UNIQUE INDEX uk_user_name ON tb_user (user_name);

3.3 复合索引

sql
-- 复合索引:按查询顺序排列列
CREATE INDEX idx_dept_status ON tb_user (dept_id, status);

-- 查询示例(遵循最左前缀原则)
-- ✅ 使用索引
SELECT * FROM tb_user WHERE dept_id = 1;
SELECT * FROM tb_user WHERE dept_id = 1 AND status = 1;

-- ❌ 不使用索引(跳过了 dept_id)
SELECT * FROM tb_user WHERE status = 1;

3.4 查看索引

sql
-- 查看表的索引
SHOW INDEX FROM tb_user;

3.5 删除索引

sql
-- 方式一
ALTER TABLE tb_user DROP INDEX idx_age;

-- 方式二
DROP INDEX idx_age ON tb_user;

3.6 索引使用原则

  1. 经常查询的列创建索引
  2. 经常作为条件的列创建索引
  3. 唯一性高的列考虑唯一索引
  4. 避免过多索引,一般不超过5个
  5. 复合索引遵循最左前缀原则
  6. 小表不需要索引

四、视图操作

视图是虚拟表,不存储数据,只存储查询逻辑。

4.1 创建视图

sql
CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

-- 示例:创建用户部门视图
CREATE VIEW v_user_dept AS
SELECT u.id, u.user_name, u.age, d.dept_name
FROM tb_user u
LEFT JOIN tb_dept d ON u.dept_id = d.id;

4.2 使用视图

sql
-- 像查询普通表一样查询视图
SELECT * FROM v_user_dept WHERE dept_name = '技术部';

4.3 删除视图

sql
DROP VIEW [IF EXISTS] v_user_dept;

五、DDL 速查表

操作语法
创建数据库CREATE DATABASE db_name;
删除数据库DROP DATABASE db_name;
创建表CREATE TABLE table_name (...);
修改表结构ALTER TABLE table_name ...;
删除表DROP TABLE table_name;
清空表TRUNCATE TABLE table_name;
创建索引CREATE INDEX idx_name ON table_name (column);
删除索引DROP INDEX idx_name ON table_name;
创建视图CREATE VIEW view_name AS SELECT ...;
删除视图DROP VIEW view_name;
最近更新