数据库基础夯实:从零手写DDL与DML,MySQL核心语法实战解析

上篇文章:

用系统调用从零封装一个C语言标准I/O库 | 附源码

拒绝踩坑!Windows下MySQL 8.0核心架构原理解析与纯净安装保姆级指南(附"绿色版"Navicat下载)

目录

[一、 DDL 实战:数据库与表的创建](#一、 DDL 实战:数据库与表的创建)

[1. 数据库的创建与字符集选择](#1. 数据库的创建与字符集选择)

[2. 关系型数据表的创建:跨越外键依赖的陷阱](#2. 关系型数据表的创建:跨越外键依赖的陷阱)

[二、 DDL 实战:表结构的重构 (ALTER TABLE)](#二、 DDL 实战:表结构的重构 (ALTER TABLE))

[三、 DML 实战:数据的增删改查](#三、 DML 实战:数据的增删改查)

[1. 数据的批量插入 (INSERT)](#1. 数据的批量插入 (INSERT))

[2. 数据的精准更新与删除 (UPDATE & DELETE)](#2. 数据的精准更新与删除 (UPDATE & DELETE))

结语


在上一篇文章中,我们深度解析了 MySQL 在 Windows 下的底层架构与环境搭建。环境准备就绪后,对于立志走向后端开发、数据分析或架构设计方向的开发者而言,摒弃图形界面客户端的"点点点",掌握纯手写 SQL 语句的能力是必须跨越的门槛

本文将结合高校经典的数据库实验场景,从创建数据库开始,深度剖析 DDL(数据定义语言)与 DML(数据操作语言)的核心逻辑,并详细解释外键依赖引发的建表顺序约束问题。

一、 DDL 实战:数据库与表的创建

DDL(Data Definition Language)用于定义或修改数据库的结构(Schema)。

1. 数据库的创建与字符集选择

创建一个数据库不仅仅是给它命名,更重要的是规范它的"基因"------字符集和排序规则。

复制代码
-- 创建数据库并指定字符集和排序规则
CREATE DATABASE ComInfo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

-- 切换上下文到该数据库
USE ComInfo;

深度解析

  • 为什么不用 utf8 而是 utf8mb4?MySQL 中的 utf8 实际上是残缺的,最多只支持 3 个字节,无法存储 Emoji 表情符号(如 😭)和一些复杂的生僻字。utf8mb4 才是真正的 UTF-8,是现代应用开发的绝对标准配置。

  • utf8mb4_0900_ai_ci0900 代表基于 Unicode 9.0 规范;ai 代表 Accent Insensitive(不区分重音);ci 代表 Case Insensitive(不区分大小写)。这极大方便了后续的字符串模糊查询。

2. 关系型数据表的创建:跨越外键依赖的陷阱

在关系型数据库中,表与表之间常常存在引用关系(外键)。在创建表时,必须遵循"先有被依赖者,后有依赖者"的原则

根据实验需求,职工表依赖商店表(工号所属的店号),销售表依赖商店表和商品表。因此,创建顺序必须严格为:商店表 -> 商品表 -> 职工表 -> 销售表。

复制代码
-- 第一步:创建被依赖的基础表(商店表、商品表)
CREATE TABLE 商店表 (
    店号 CHAR(6) PRIMARY KEY NOT NULL,
    店名 CHAR(22) NOT NULL,
    店址 CHAR(36),
    电话 CHAR(11)
);

CREATE TABLE 商品表 (
    品号 CHAR(6) PRIMARY KEY NOT NULL,
    品名 CHAR(22) NOT NULL,
    厂商 CHAR(22) NOT NULL,
    厂址 CHAR(36) NOT NULL,
    -- DECIMAL(9,2) 表示总长度最多9位数字,其中小数点后固定占2位
    单价 DECIMAL(9,2), 
    数量 INT
);

-- 第二步:创建依赖表(职工表,包含自参照外键)
CREATE TABLE 职工表 (
    工号 CHAR(6) PRIMARY KEY,
    姓名 CHAR(8) NOT NULL,
    性别 ENUM('男', '女') NOT NULL,  -- 使用枚举类型约束脏数据输入
    年龄 INT NOT NULL,
    电话 CHAR(11),
    店号 CHAR(6),
    工资 DECIMAL(9,2),
    聘期 DECIMAL(3,1),
    职务补助 DECIMAL(9,2),
    经理工号 CHAR(6),
    -- 定义外键约束
    FOREIGN KEY (店号) REFERENCES 商店表(店号),
    FOREIGN KEY (经理工号) REFERENCES 职工表(工号) -- 树形结构的自参照设计
);

-- 第三步:创建多对多关系映射表(销售表,复合主键)
CREATE TABLE 销售表 (
    店号 CHAR(6),
    品号 CHAR(6),
    销售金额 DECIMAL(12,2),
    -- 复合主键:店号和品号的组合必须唯一
    PRIMARY KEY (店号, 品号), 
    FOREIGN KEY (店号) REFERENCES 商店表(店号),
    FOREIGN KEY (品号) REFERENCES 商品表(品号)
);

二、 DDL 实战:表结构的重构 (ALTER TABLE)

在敏捷开发中,随着业务的迭代,表结构的变更是家常便饭。ALTER TABLE 语句提供了不丢失数据的前提下修改表结构的能力。

复制代码
-- (1) 新增字段:添加"工作日期"数据项,数据类型为 DATE
ALTER TABLE 职工表 ADD 工作日期 DATE;

-- (2) 添加约束:给电话增加唯一性约束 (UNIQUE)
ALTER TABLE 职工表 ADD UNIQUE (电话);

-- (3) 删除约束:删除电话的唯一性约束
-- 避坑:在 MySQL 中,如果不显式指定索引名,UNIQUE 约束的默认索引名与其作用的列名相同。删除约束本质上是删除索引。
ALTER TABLE 职工表 DROP INDEX 电话;

-- (4) 修改字段类型:将 DATE (仅年月日) 修改为 DATETIME (精确到时分秒)
ALTER TABLE 职工表 MODIFY 工作日期 DATETIME;

-- (5) 删除字段:极其危险的操作,生产环境慎用!
ALTER TABLE 职工表 DROP COLUMN 工作日期;

三、 DML 实战:数据的增删改查

DML(Data Manipulation Language)是我们日常编写业务逻辑时用得最多的语法。

1. 数据的批量插入 (INSERT)

如果插入的数据涵盖了表中的所有列,且顺序与建表时严格一致,可以省略列名(不推荐在生产环境这么做,但在实验中可以简化代码)。

复制代码
-- 为职工表插入数据
INSERT INTO 职工表 VALUES
('A00001','张三','男',29,'13666699999','S00001',5000,6,2000,'A00001'),
('A00002','李四','女',26,'13999966666','S00001',3000,5,0.00,'A00001'),
('A00003','王五','男',29,'13669696969','S00002',6000,9,3000,'A00003'),
('A00004','孙六','女',26,'13996969696','S00002',4000,8,0.00,'A00003');

-- 显式指定列名的插入(最佳实践):当某些字段(如工资)缺失时必须这样写
INSERT INTO 职工表 (工号, 姓名, 性别, 年龄, 电话, 店号, 经理工号) 
VALUES ('A00006','刘霞','女',22,'13999396906','S00002','A00003');

2. 数据的精准更新与删除 (UPDATE & DELETE)

架构师忠告:任何时候敲下 UPDATEDELETE 时,请条件反射般地检查是否带上了 WHERE 子句! 遗漏 WHERE 会导致全表数据被污染或清空。

复制代码
-- 按精确条件更新:把工号为 A00001 的姓名改为张娟
UPDATE 职工表 SET 姓名 = '张娟' WHERE 工号 = 'A00001';

-- 批量逻辑运算更新:将所有职工的年龄增加 1 岁
-- 这里利用了字段自身参与算术运算的特性
UPDATE 职工表 SET 年龄 = 年龄 + 1;

-- 精确删除:删除店号为 S00002 的销售记录
DELETE FROM 销售表 WHERE 店号 = 'S00002';

-- 危险操作 - 全表清空:删除销售表所有记录
-- 提示:如果是要极速清空一张几百万行的大表,建议使用 DDL 语法的 TRUNCATE TABLE 销售表; 会比 DELETE 快得多。
DELETE FROM 销售表;

结语

CREATEALTER,再从 INSERTDELETE,这组寥寥数十行的 SQL 勾勒出了关系型数据库最核心的流转生命周期。习惯手写 SQL、理解外键的制约关系以及字段类型的底层含义,是你从一名"软件使用者"向"系统开发者"蜕变的关键一步。

相关推荐
爱学习的小囧2 小时前
VMware NSX-T Data Center 3.2.3.0 部署后账号密码获取及登录配置教程
linux·运维·服务器·网络·数据库·esxi
xiaokangzhe2 小时前
NoSQL之Redis配置与优化
数据库
weixin_408717772 小时前
CSS如何优化大型项目样式_使用SASS预处理器提升开发效率
jvm·数据库·python
2301_813599552 小时前
CSS如何解决CSS引入后的样式覆盖_理解优先级原则避免重写
jvm·数据库·python
lkx097882 小时前
MySQL
数据库·mysql
betazhou2 小时前
TDSQL-PG创建测试表并定时插入数据模拟生产
前端·javascript·数据库·tdsql·tdsql-pg
kiku18182 小时前
NoSQL之Redis配置与优化
数据库·redis·非关系型数据库
喵了几个咪2 小时前
MySQL 运维实战:ibd 文件批量转换为 SQL 完整指南(基于 ibd2sql)
运维·sql·mysql
跃渊Yuey3 小时前
【MySQL】MySQL库的操作
数据库·mysql