MySQL 系统学习 第二阶段 SQL 第一章:DDL(Data Definition Language)

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 email

修改字段名称:

复制代码
复制代码
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 清空表数据

本章思考题

请尝试回答下面几个问题:

  1. CREATE DATABASECREATE TABLE 的区别是什么
    CREATE DATABASE 用于创建数据库,操作对象是 Database;CREATE TABLE 用于创建数据表,操作对象是 Table。一个数据库可以包含多张数据表,因此创建表之前必须先有数据库。

  2. 为什么创建表之前必须先执行 USE 数据库名
    因为同一个 MySQL 实例中可以存在多个数据库,创建表时必须明确表属于哪个数据库。USE 数据库名 的作用就是设置当前数据库,之后执行的 SQL 默认都在该数据库中进行。

  3. DROP TABLETRUNCATE TABLE 有什么区别?
    DROP TABLE 会删除整个数据表,包括表结构和数据;TRUNCATE TABLE 只清空表中的数据,保留表结构,因此清空后仍然可以继续插入数据。

  4. ALTER TABLE 能完成哪些常见操作?

    ALTER TABLE 用于修改已有表的结构,常见操作包括:添加字段(ADD COLUMN)、修改字段类型(MODIFY)、修改字段名称(不同版本语法略有区别,如 RENAME COLUMN)、删除字段(DROP COLUMN)、后续还可以用于添加或删除主键、索引、唯一约束、外键等。

  5. 为什么实际开发中推荐使用 IF EXISTSIF NOT EXISTS
    IF EXISTSIF NOT EXISTS 可以避免因对象已存在或不存在而导致 SQL 执行失败,提高脚本的容错性和幂等性,因此在初始化数据库、自动部署和数据库迁移中非常常用。

相关推荐
青山是哪个青山7 小时前
LangChain 学习笔记(四):Message 与提示词模板
笔记·学习·langchain
小白勇闯网安圈8 小时前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
hsjiasb8 小时前
FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5
stm32·单片机·学习·学习笔记·freertos
崇子嵘8 小时前
基于zynqMP15eg的linux驱动学习
学习
努力的小雨9 小时前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图9 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl9 小时前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl9 小时前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl10 小时前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库
知识分享小能手10 小时前
线性代数学习教程,从入门到精通,向量组的线性相关性 — 完整知识点梳理(7)
学习·线性代数·机器学习