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 执行失败,提高脚本的容错性和幂等性,因此在初始化数据库、自动部署和数据库迁移中非常常用。

相关推荐
云絮.2 小时前
数据库事务
java·开发语言·数据库
Go-higher2 小时前
DriverTest 驾考知识卡片学习助手 —— 一款基于 Jetpack Compose 的现代 Android 学习APP
android·学习
Leon-Ning Liu2 小时前
【真实经验分享】OGG抽取进程报错 ORA-07445 [kgherrordmp()+986] ORA-00600 [17114]分析步骤
运维·数据库
CCPC不拿奖不改名2 小时前
Redis 工程化部署深度解析
linux·服务器·数据库·redis·深度学习·缓存·rag
星幻元宇VR2 小时前
公共安全主题展厅设备【防洪防汛安全科普系统】
科技·学习·安全
吴声子夜歌3 小时前
SQL进阶——自连接
数据库·sql
AI科技星3 小时前
32维超复数流形中意识信息场与物质耦合的拓扑动力学
人工智能·学习·算法·数据挖掘·回归·乖乖数学·全域数学
云贝教育-郑老师3 小时前
TDSQL(MySQL版)分布式事务实现机制深度解析:从两阶段提交到全局一致性读
数据库·sql
gb448oww53 小时前
Redis分布式锁进阶第三十五篇
数据库·redis·分布式
鱼很腾apoc3 小时前
【Linux】第7期 进程间通信 (IPC) 详解:管道 (匿名 / 命名) + System V
linux·服务器·c语言·学习·进程间通信·ipc