DDL:Data Definition Language(数据定义语言)
一句话理解:
DDL 用来定义数据库的"骨架",包括数据库、表、字段等结构。
它不操作数据,而是操作数据的"容器"。
例如建房子:
DDL
│
├── 建小区(CREATE DATABASE)
├── 建房子(CREATE TABLE)
├── 加房间(ALTER TABLE)
├── 拆房子(DROP TABLE)
└── 清空房子(TRUNCATE TABLE)
第一节 创建数据库(CREATE DATABASE)
假设我们要开发一个图书管理系统。
首先要创建数据库:
CREATE DATABASE book_db;
执行后:
MySQL
│
├── mysql
├── information_schema
├── performance_schema
└── book_db ← 新建
CREATE DATABASE 的语法
CREATE DATABASE 数据库名;
例如:
CREATE DATABASE school;
CREATE DATABASE mall;
CREATE DATABASE company;
数据库命名规范
推荐:
全小写
多个单词使用下划线
例如:
user_center
book_system
mall_db
不推荐:
BookSystem
Book-System
我的数据库
原因:
不同操作系统对大小写支持不同,统一使用小写最省心。
第二节 查看数据库
查看当前所有数据库:
SHOW DATABASES;
例如返回:
information_schema
mysql
performance_schema
sys
book_db
查看当前正在使用哪个数据库:
SELECT DATABASE();
返回:
book_db
如果没有选择数据库:
NULL
第三节 使用数据库
创建完成后,并不能直接建表。
必须先进入数据库:
USE book_db;
以后所有 SQL 都会默认在这个数据库里执行。
例如:
USE school;
之后:
CREATE TABLE student (...);
student 就属于 school 数据库。
第四节 删除数据库
语法:
DROP DATABASE 数据库名;
例如:
DROP DATABASE school;
执行后:
整个数据库都会删除。
包括:
school
│
├── student
├── teacher
└── score
全部消失。
⚠️ 注意:DROP DATABASE 是危险操作,生产环境要非常谨慎。
第五节 IF EXISTS 与 IF NOT EXISTS
为了避免报错,MySQL 提供了两个很常用的关键字。
创建时避免重复
CREATE DATABASE IF NOT EXISTS book_db;
意思:
如果数据库不存在,就创建;存在就什么也不做。
删除时避免不存在报错
DROP DATABASE IF EXISTS book_db;
意思:
如果数据库存在,就删除;不存在也不会报错。
第六节 创建数据表(CREATE TABLE)
数据库创建好以后,就可以建表了。
例如:
USE book_db;
CREATE TABLE student (
id INT,
name VARCHAR(50),
age INT
);
执行后:
book_db
│
└── student
├── id
├── name
└── age
CREATE TABLE 语法
CREATE TABLE 表名 (
字段名 数据类型,
字段名 数据类型,
...
);
例如:
CREATE TABLE user (
id INT,
username VARCHAR(100),
password VARCHAR(100),
age INT
);
这里:
| 字段 | 数据类型 | 说明 |
|---|---|---|
| id | INT | 整数 |
| username | VARCHAR(100) | 最长100个字符 |
| password | VARCHAR(100) | 密码 |
| age | INT | 年龄 |
第七节 查看数据表
查看当前数据库有哪些表:
SHOW TABLES;
例如:
student
teacher
course
查看表结构:
DESC student;
或者:
DESCRIBE student;
返回:
| Field | Type | Null | Key |
|---|---|---|---|
| id | int | YES | |
| name | varchar(50) | YES | |
| age | int | YES |
第八节 修改表(ALTER TABLE)
假设 student 表没有邮箱字段。
增加一个字段:
ALTER TABLE student
ADD email VARCHAR(100);
现在表结构变成:
| id | name | age |
|---|
修改字段名称:
ALTER TABLE student
RENAME COLUMN name TO username;
修改字段类型:
ALTER TABLE student
MODIFY age BIGINT;
删除字段:
ALTER TABLE student
DROP COLUMN email;
第九节 删除数据表
删除整个表:
DROP TABLE student;
执行后:
student
整个表不存在了。
里面的数据也一起删除。
第十节 TRUNCATE 与 DROP 的区别
很多初学者容易混淆。
假设:
student 表有 100 万条数据。
DROP TABLE
DROP TABLE student;
结果:
student 表没了
TRUNCATE TABLE
TRUNCATE TABLE student;
结果:
student 表还在
但是数据全部清空
例如:
原来:
| id | name |
|---|---|
| 1 | Tom |
| 2 | Jack |
执行:
TRUNCATE TABLE student;
结果:
| id | name |
|---|
一条数据都没有。
DDL 命令总结
| 命令 | 作用 |
|---|---|
CREATE DATABASE |
创建数据库 |
SHOW DATABASES |
查看所有数据库 |
USE |
切换数据库 |
SELECT DATABASE() |
查看当前数据库 |
DROP DATABASE |
删除数据库 |
CREATE TABLE |
创建表 |
SHOW TABLES |
查看所有表 |
DESC 表名 |
查看表结构 |
ALTER TABLE |
修改表结构 |
DROP TABLE |
删除表 |
TRUNCATE TABLE |
清空表数据 |
本章思考题
请尝试回答下面几个问题:
-
CREATE DATABASE和CREATE TABLE的区别是什么
CREATE DATABASE用于创建数据库,操作对象是 Database;CREATE TABLE用于创建数据表,操作对象是 Table。一个数据库可以包含多张数据表,因此创建表之前必须先有数据库。 -
为什么创建表之前必须先执行
USE 数据库名?
因为同一个 MySQL 实例中可以存在多个数据库,创建表时必须明确表属于哪个数据库。USE 数据库名的作用就是设置当前数据库,之后执行的 SQL 默认都在该数据库中进行。 -
DROP TABLE和TRUNCATE TABLE有什么区别?
DROP TABLE会删除整个数据表,包括表结构和数据;TRUNCATE TABLE只清空表中的数据,保留表结构,因此清空后仍然可以继续插入数据。 -
ALTER TABLE能完成哪些常见操作?ALTER TABLE用于修改已有表的结构,常见操作包括:添加字段(ADD COLUMN)、修改字段类型(MODIFY)、修改字段名称(不同版本语法略有区别,如RENAME COLUMN)、删除字段(DROP COLUMN)、后续还可以用于添加或删除主键、索引、唯一约束、外键等。 -
为什么实际开发中推荐使用
IF EXISTS和IF NOT EXISTS?
IF EXISTS和IF NOT EXISTS可以避免因对象已存在或不存在而导致 SQL 执行失败,提高脚本的容错性和幂等性,因此在初始化数据库、自动部署和数据库迁移中非常常用。