上篇文章:
拒绝踩坑!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_ci:0900代表基于 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)
架构师忠告:任何时候敲下 UPDATE 或 DELETE 时,请条件反射般地检查是否带上了 WHERE 子句! 遗漏 WHERE 会导致全表数据被污染或清空。
-- 按精确条件更新:把工号为 A00001 的姓名改为张娟
UPDATE 职工表 SET 姓名 = '张娟' WHERE 工号 = 'A00001';
-- 批量逻辑运算更新:将所有职工的年龄增加 1 岁
-- 这里利用了字段自身参与算术运算的特性
UPDATE 职工表 SET 年龄 = 年龄 + 1;
-- 精确删除:删除店号为 S00002 的销售记录
DELETE FROM 销售表 WHERE 店号 = 'S00002';
-- 危险操作 - 全表清空:删除销售表所有记录
-- 提示:如果是要极速清空一张几百万行的大表,建议使用 DDL 语法的 TRUNCATE TABLE 销售表; 会比 DELETE 快得多。
DELETE FROM 销售表;
结语
从 CREATE 到 ALTER,再从 INSERT 到 DELETE,这组寥寥数十行的 SQL 勾勒出了关系型数据库最核心的流转生命周期。习惯手写 SQL、理解外键的制约关系以及字段类型的底层含义,是你从一名"软件使用者"向"系统开发者"蜕变的关键一步。