数据库基础夯实:从零手写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、理解外键的制约关系以及字段类型的底层含义,是你从一名"软件使用者"向"系统开发者"蜕变的关键一步。

相关推荐
旺仔学长 哈哈28 分钟前
Spring Boot 智能停车场管理系统---附源码+数据库文档
数据库·spring boot·后端·智能停车场
ClickHouseDB1 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
数智化管理手记1 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌1 小时前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点2 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战2 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水2 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)3 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑3 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨4 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技