【MySQL速成指南】数据库定义语言(DDL)详解:从建库到改表!
一、DDL是什么?
数据库定义语言(Data Definition Language, DDL) 是用于定义和管理数据库结构的语言,是构建数据世界的基石。本文深入讲解SQL中DDL的核心语法与应用场景,涵盖数据库、表、索引等对象的创建、修改和删除操作。
二、数据库级操作
1. 创建数据库
-- 创建名为school的数据库
-- CHARACTER SET指定字符集为utf8mb4(支持4字节Unicode字符)
-- COLLATE设置排序规则为unicode不区分大小写格式
CREATE DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 防止重复创建
CREATE DATABASE IF NOT EXISTS school;
2. 修改数据库
-- 修改数据库字符集为utf8
-- 注意:已有数据不会自动转换字符编码
ALTER DATABASE school
CHARACTER SET = utf8;
3. 删除数据库(谨慎,危险操作!)
-- 安全删除数据库:先检查是否存在再删除
-- 生产环境慎用,建议提前备份重要数据
DROP DATABASE IF EXISTS old_db;
三、数据表操作
1. 创建表
-- 创建学生表包含自增主键和外键约束
-- AUTO_INCREMENT:MySQL的自增列语法
-- CONSTRAINT:显示命名外键约束(便于后续管理)
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT, -- 设置主键与自增
name VARCHAR(50) NOT NULL, -- 非空姓名列
birth_date DATE, -- 日期类型存储生日
class_id INT, -- 班级ID(外键字段)
CONSTRAINT fk_class -- 外键约束命名
FOREIGN KEY (class_id) REFERENCES classes(class_id) -- 关联班级表
);
2. 修改表结构
-- 新增email字段,长度100允许NULL值
ALTER TABLE students
ADD email VARCHAR(100);
-- 修改name字段类型为VARCHAR(80)
-- 注意:已有数据长度超过80会导致修改失败
ALTER TABLE students
MODIFY COLUMN name VARCHAR(80);
-- 删除birth_date字段
-- 警告:该操作会永久删除列及其数据
ALTER TABLE students
DROP COLUMN birth_date;
-- 重命名表(MySQL语法)
ALTER TABLE students
RENAME TO pupils;
-- 添加默认值
ALTER TABLE employees
ALTER COLUMN hire_date
SET DEFAULT '2024-01-01';
-- 删除默认值
ALTER TABLE orders
ALTER COLUMN order_date
DROP DEFAULT;
-- MySQL重命名列(同时可修改类型)
ALTER TABLE students
CHANGE COLUMN birth_date birth_year INT; -- 将日期列改为年份整数
-- 将phone列调整到email列之后(MySQL语法)
ALTER TABLE customers
MODIFY phone VARCHAR(20) AFTER email;
四、‘用户’ 操作与权限管理
1. 创建用户
CREATE USER '用户名'@'主机名'
IDENTIFIED BY '密码';
示例:
-- 创建本地用户
CREATE USER 'admin'@'localhost'
IDENTIFIED BY 'Admin123!';
-- 创建远程用户(允许任意主机访问)
CREATE USER 'remote_user'@'%'
IDENTIFIED BY 'Remote123!';
2. 修改用户
-- 修改用户名
RENAME USER '旧用户名'@'主机名'
TO '新用户名'@'主机名';
--修改密码
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码'); -- MySQL 5.7+
ALTER USER '用户名'@'主机名' -- MySQL 8.0+
IDENTIFIED BY '新密码';
3. 删除用户
DROP USER [IF EXISTS] '用户名'@'主机名';
4. 权限管理
-- 授予权限
GRANT 权限列表
ON 数据库名.表名
TO '用户名'@'主机名'
[WITH GRANT OPTION];
-- 回收权限
REVOKE 权限列表
ON 数据库名.表名
FROM '用户名'@'主机名';
示例:
-- 授予SELECT和INSERT权限
GRANT SELECT, INSERT
ON school_db.*
TO 'admin'@'localhost';
-- 授予所有权限并允许授权他人
GRANT ALL PRIVILEGES
ON school_db.*
TO 'super_admin'@'%'
WITH GRANT OPTION;
-- 回收DELETE权限
REVOKE DELETE
ON school_db.tb_student
FROM 'admin'@'localhost';
五、约束管理
1. 主键约束
-- 为已有表添加主键约束
-- 主键字段必须包含唯一且非空的值
ALTER TABLE orders
ADD PRIMARY KEY (order_id);
2. 外键约束
-- 添加级联删除外键约束
-- ON DELETE CASCADE:主表删除记录时自动删除子表关联记录
ALTER TABLE order_items
ADD CONSTRAINT fk_order
FOREIGN KEY (order_id)
REFERENCES orders(order_id)
ON DELETE CASCADE;
3. 唯一约束
-- 确保邮箱地址在表中唯一
-- 允许NULL值(不同数据库实现可能不同)
ALTER TABLE employees
ADD UNIQUE (employee_email);
六、索引管理
1. 创建索引
-- 为客户的姓氏创建普通索引
-- 适用于WHERE lastName='xxx'的查询优化
CREATE INDEX idx_name
ON customers(last_name);
-- 创建联合索引(最左前缀原则)
-- 优化同时使用last_name和email的查询
CREATE INDEX idx_name_email
ON users(last_name, email);
-- 创建唯一索引(强制电话号码唯一)
-- 与唯一约束的区别:索引侧重查询优化,约束侧重数据完整性
CREATE UNIQUE INDEX uidx_phone
ON contacts(phone_number);
2. 删除索引
-- 删除指定表的索引
DROP INDEX idx_name ON customers;
七、视图管理
1. 创建视图
-- 创建活跃用户视图
-- 视图不存储实际数据,每次访问动态查询
CREATE VIEW active_users AS
SELECT user_id, username, email
FROM users
WHERE is_active = 1; -- 筛选状态为激活的用户
2. 修改视图
-- 更新视图定义:增加注册时间筛选条件
-- 注意:部分数据库不支持ALTER VIEW(需重建视图)
ALTER VIEW active_users AS
SELECT user_id, username, registration_date
FROM users
WHERE last_login > '2023-01-01'; -- 筛选2023年后登录的用户
3. 删除视图
-- 安全删除视图:存在才执行删除
DROP VIEW IF EXISTS inactive_users;
# 希望这篇总结有助于大家!如果觉得有用,点赞⭐收藏🌟关注👀 三连支持吧!