我之前一碰数据库就想直接写 SELECT,表怎么建、约束干什么说不清。把前 20 节过完才发现:老师其实在逼我先把容器搭好------库、表、类型、主键、外键。容器歪了,后面数据再怎么查都会别扭。
下面按我自己的理解串一遍:概念 → 安装连接 → SQL 分类 → 库表 DDL → 类型 → 约束。
目录
- [1. 我给自己定的系列节奏](#1. 我给自己定的系列节奏)
- [2. 我怎么理解「数据库」这几个词](#2. 我怎么理解「数据库」这几个词)
- [3. 我为什么先学 MySQL](#3. 我为什么先学 MySQL)
- [4. 我怎么装、怎么连](#4. 我怎么装、怎么连)
- [5. SQL 五类,我用一张表记住](#5. SQL 五类,我用一张表记住)
- [6. 库和表:我敲过的 DDL](#6. 库和表:我敲过的 DDL)
- [7. 数据类型:我怎么选](#7. 数据类型:我怎么选)
- [8. 约束:主键和外键我是这么记的](#8. 约束:主键和外键我是这么记的)
- [9. 前 20 节 SQL 速查(我的小抄)](#9. 前 20 节 SQL 速查(我的小抄))
- [10. 我给自己的检查清单](#10. 我给自己的检查清单)
- [11. 下一篇我打算写什么](#11. 下一篇我打算写什么)
- 参考链接
1. 我给自己定的系列节奏
我打算把 MySQL 笔记拆成 5 篇,这一篇只覆盖「能建好结构」:
| 篇序 | 主题 | 学完我希望自己能...... |
|---|---|---|
| 01(这篇) | 概念、安装、DDL、类型、约束 | 独立建库建表,加主键/外键 |
| 02 | DML 与基础查询 | 往表里增删改,会单表查 |
| 03 | 条件、排序、聚合、分组 | 写出带业务条件的统计 |
| 04 | 多表关联与子查询 | 做员工-部门这类联表 |
| 05 | 事务、索引与实践规范 | 少踩一致性/性能的坑 |


2. 我怎么理解「数据库」这几个词
刚开始这五个概念我老混,后来我强迫自己用一句话区分:
| 概念 | 我的一句话 |
|---|---|
| 数据(Data) | 我要存的东西:字、数、图、音视频 |
| 数据库(Database) | 按结构排好的数据集合 |
| DBMS | 管库的软件,我学的是 MySQL |
| 数据库应用程序 | 通过 DBMS 用数据的程序(后台、App) |
| DBA | 负责运维、备份、权限的人 |
我记关系就靠这条链:
text
应用程序 → DBMS(MySQL) → 数据库(若干表) → 数据行


大类我这样分:
- 关系型:二维表 + SQL,MySQL / Oracle / SQL Server
- 非关系型:文档、键值等,MongoDB / Redis
我现阶段主线是 关系型 + MySQL 。课程演示是 MySQL 5.7.x(比如 5.7.36) ,语法大体通用;CHECK 这类特性 5.7 和 8.0 不一样,我下面会标出来。手册我常翻:MySQL 8.0 Reference Manual。
3. 我为什么先学 MySQL
课里对 MySQL 的介绍,我提炼成自己认的几条:
- 社区版能免费学、免费做小项目
- 支持标准 SQL,概念可迁移
- Windows / Linux / macOS 都能跑
- Java、Python 等语言驱动成熟
- 分社区版和企业版;我学习和普通项目用社区版就够
它现在属于 Oracle 体系,但这不影响我当「入门第一站」。
4. 我怎么装、怎么连
4.1 下载安装(课程 Windows 路线)
我按课里的步骤走:
- 进 MySQL 官网下载区
- 打开 MySQL Community Downloads
- 下 Windows 的 MySQL Installer
- 自定义安装,位数和系统对齐
- 默认端口
3306,给root设密码(这个密码我单独记了) - 装完后它是 Windows 服务,我在「服务」里启停
下载入口:MySQL Community Downloads。
4.2 卸载时我踩过的点
Installer 卸完还不够,课里提醒还要查:
Program Files安装目录ProgramData数据目录
数据目录残留,重装时最容易出「旧配置/旧密码还在」的怪事。我下次重装会先清这两处。
4.3 命令行连接
我理解 MySQL 是 客户端 ↔ 服务端:我敲 SQL,服务端执行。
sql
mysql -u root -p
-u:用户名-p:再输入密码
我刻意不把密码写在命令行里,怕进历史记录。连上先看库:
sql
SHOW DATABASES;
4.4 Navicat
图形客户端我用起来更顺手,本机一般填:
| 项 | 我填的值 |
|---|---|
| 主机 | localhost |
| 端口 | 3306 |
| 用户 | root |
| 密码 | 安装时设的 |
课里一句话点醒我:Navicat 点的每一步,底层还是 SQL。所以我逼自己命令行和图形都会一点,出问题才有得查。
5. SQL 五类,我用一张表记住
SQL 是操作关系库的标准语言。我按功能记五类:
| 分类 | 全称 | 我的理解 | 常见关键字 |
|---|---|---|---|
| DQL | 数据查询语言 | 查 | SELECT FROM WHERE ORDER BY |
| DML | 数据操作语言 | 增删改「行」 | INSERT UPDATE DELETE |
| DDL | 数据定义语言 | 建改删「对象」 | CREATE ALTER DROP |
| DCL | 数据控制语言 | 权限 | GRANT REVOKE |
| TCL | 事务控制语言 | 提交/回滚 | COMMIT ROLLBACK SAVEPOINT |
我给自己定的写法习惯:
- 关键字不区分大小写,但我统一大写,扫代码更快
- 长语句拆多行
- 语句末尾加
;
这篇我只啃 DDL;往表里装数据、查数据留给后面。
6. 库和表:我敲过的 DDL
6.1 库
sql
CREATE DATABASE test DEFAULT CHARACTER SET utf8;
SHOW DATABASES;
USE test;
DROP DATABASE test;
DROP DATABASE 我只在练习库用。字符集课里写 utf8;我后面迁 8.0 会优先考虑 utf8mb4,中文和 emoji 更稳。参考:Character Sets and Collations。
6.2 表
sql
CREATE TABLE employee (
employee_id INT,
employee_name VARCHAR(10),
salary FLOAT(8,2)
);
SHOW TABLES;
DROP TABLE employee;
6.3 改表:我练熟的 ALTER
课把改表名、列名、类型、加列、删列拆开讲,我归并成一套:
sql
-- 改表名
ALTER TABLE employee RENAME emp;
-- 改列名(就算只改名,也要再写一遍类型)
ALTER TABLE emp
CHANGE COLUMN employee_name name VARCHAR(10);
-- 只改类型/长度
ALTER TABLE emp
MODIFY name VARCHAR(40);
-- 加列
ALTER TABLE emp
ADD COLUMN commission_pct FLOAT(4,2);
-- 删列(列上的数据一起没,我删前会再确认)
ALTER TABLE emp
DROP COLUMN commission_pct;
我给自己标的三个坑:
CHANGE COLUMN必须带数据类型DROP COLUMN基本不可逆(没备份就没了)- 先
USE对库,再改表,别改到别的库
语法细节我对照:ALTER TABLE Statement、CREATE TABLE Syntax。
7. 数据类型:我怎么选
原则我写成六个字:够用、可预期、少浪费。
7.1 整数
TINYINT / SMALLINT / MEDIUMINT / INT / BIGINT
- 状态、性别这类小范围 → 我倾向
TINYINT - 普通编号 →
INT - 特别大的 ID → 再考虑
BIGINT
7.2 浮点
FLOAT(M,D)、DOUBLE(M,D):M 总位数,D 小数位。
课里用浮点带我认识「带小数的数」。金额类我后面会改用 DECIMAL,先记一笔。
7.3 字符
| 类型 | 我的用法 |
|---|---|
CHAR(N) |
长度固定的编码、标记 |
VARCHAR(N) |
姓名、标题等变长 |
TEXT |
长备注、长正文 |
7.4 日期时间
DATE:年月日TIME:时分秒DATETIME:日期+时间TIMESTAMP:时间戳(时区和范围和DATETIME有差别,我后面再抠)
7.5 二进制
BLOB 能塞图片音视频。大文件要不要进库,工程上另说;入门我只记住「有这个类型」。
8. 约束:主键和外键我是这么记的
约束 = 写入时帮我拦脏数据,保正确、有效、完整。
| 约束 | 作用(我的记法) |
|---|---|
PRIMARY KEY |
唯一 + 非空,认出这一行 |
FOREIGN KEY |
引用另一表,关联必须真实 |
UNIQUE |
不重复 |
NOT NULL |
不许空 |
CHECK |
自定义条件 |
版本坑 :课程是 MySQL 5.7 。5.7 里
CHECK往往写了也不强制;8.0.16 起才真正生效。我笔记里不当 5.7 的 CHECK 能拦数据。


8.1 主键
主键 ≈ 唯一 + 非空。一张表我默认都要能唯一标识行的主键。
- 单一主键:一列
- 联合主键:多列拼起来才唯一
sql
ALTER TABLE emp
ADD PRIMARY KEY (employee_id);
ALTER TABLE emp
MODIFY employee_id INT AUTO_INCREMENT;
删主键时,如果列上有自增,我按课里的顺序:先去掉 AUTO_INCREMENT,再 DROP PRIMARY KEY:
sql
ALTER TABLE emp
MODIFY employee_id INT;
ALTER TABLE emp
DROP PRIMARY KEY;
8.2 外键
外键描述表和表的引用。比如员工属于部门:emp.dept_id 得在部门表里找得到。
我记外键列三点:
- 可以重复(多人同部门)
- 通常允许 NULL(暂时没部门)
- 非空值必须出现在被引用列里
sql
ALTER TABLE emp
ADD COLUMN dept_id INT;
ALTER TABLE emp
ADD CONSTRAINT emp_fk
FOREIGN KEY (dept_id)
REFERENCES department(department_id);
删外键时,删的是约束名,不是列名------这点我第一次写错了:
sql
ALTER TABLE emp
DROP FOREIGN KEY emp_fk;
我额外记的实践点:
- 被引用列一般是主键或唯一键
- 两边类型要对齐,不然加外键直接失败
- 项目里要不要物理外键看规范,但逻辑关联我必须懂
9. 前 20 节 SQL 速查(我的小抄)
复习时我直接翻这一页:
sql
-- ========== 数据库 ==========
CREATE DATABASE test DEFAULT CHARACTER SET utf8;
SHOW DATABASES;
USE test;
DROP DATABASE test;
-- ========== 数据表 ==========
CREATE TABLE employee (
employee_id INT,
employee_name VARCHAR(10),
salary FLOAT(8,2)
);
SHOW TABLES;
DROP TABLE employee;
-- ========== 修改表结构 ==========
ALTER TABLE employee RENAME emp;
ALTER TABLE emp CHANGE COLUMN employee_name name VARCHAR(10);
ALTER TABLE emp MODIFY name VARCHAR(40);
ALTER TABLE emp ADD COLUMN commission_pct FLOAT(4,2);
ALTER TABLE emp DROP COLUMN commission_pct;
-- ========== 主键 ==========
ALTER TABLE emp ADD PRIMARY KEY (employee_id);
ALTER TABLE emp MODIFY employee_id INT AUTO_INCREMENT;
ALTER TABLE emp MODIFY employee_id INT;
ALTER TABLE emp DROP PRIMARY KEY;
-- ========== 外键 ==========
ALTER TABLE emp ADD COLUMN dept_id INT;
ALTER TABLE emp
ADD CONSTRAINT emp_fk
FOREIGN KEY (dept_id)
REFERENCES department(department_id);
ALTER TABLE emp DROP FOREIGN KEY emp_fk;
我给自己的要求:在测试库完整走两遍 建 → 改 → 加约束 → 删约束 → 删表,只看不敲等于没学。
10. 我给自己的检查清单
这篇过完,我逐项打钩:
- 能用自己的话讲清:数据 / 数据库 / DBMS / 应用程序 / DBA
- 能区分关系型和非关系型,并各举例子
- 装过(或说得出安装要点)MySQL,命令行和 Navicat 都能连
- 能说出 DQL / DML / DDL / DCL / TCL 各干什么
- 会
CREATE/SHOW/USE/DROP DATABASE - 会建表、改表名/列名/类型、加列删列
- 会按场景选 INT、VARCHAR、DATE 等
- 会加/删主键,知道自增和删主键的顺序
- 会加/删外键,知道删的是约束名
- 知道 5.7 下
CHECK基本靠不住
哪条打不上钩,我就回对应小节再敲一遍 SQL。
11. 下一篇我打算写什么
第 2 篇我准备写 DML 和基础查询:
INSERT/UPDATE/DELETE- 单表
SELECT、别名、去重 - 我容易踩的坑:全表更新、误删,以及后面要接的事务意识
容器这篇搭完,下一篇才认真往里装数据、按条件取出来。
参考链接
- MySQL Community Downloads
- MySQL 8.0 Reference Manual
- Character Sets and Collations in MySQL
- CREATE TABLE Syntax
- ALTER TABLE Statement
系列:MySQL 学习笔记 · 01/05
素材:BV1qSKc6JEaH P1---P20;字幕识别错误(如把 DROP 听成 job)我已按标准 SQL 改过。