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

相关推荐
YOU OU3 小时前
Redis基础常识与命令
数据库·redis·缓存
Database_Cool_5 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森6 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_6 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白7 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
a1117767 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
窝子面7 小时前
手搓最简前后端协作-node
javascript·数据库
我的xiaodoujiao7 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
吳所畏惧7 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh