MySQL 学习笔记 01:从概念到约束,搭好库表骨架

我之前一碰数据库就想直接写 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 路线)

我按课里的步骤走:

  1. 进 MySQL 官网下载区
  2. 打开 MySQL Community Downloads
  3. 下 Windows 的 MySQL Installer
  4. 自定义安装,位数和系统对齐
  5. 默认端口 3306 ,给 root 设密码(这个密码我单独记了)
  6. 装完后它是 Windows 服务,我在「服务」里启停

下载入口:MySQL Community Downloads

4.2 卸载时我踩过的点

Installer 卸完还不够,课里提醒还要查:

  • Program Files 安装目录
  • ProgramData 数据目录

数据目录残留,重装时最容易出「旧配置/旧密码还在」的怪事。我下次重装会先清这两处。

4.3 命令行连接

我理解 MySQL 是 客户端 ↔ 服务端:我敲 SQL,服务端执行。

sql 复制代码
mysql -u root -p
  • -u:用户名
  • -p:再输入密码

我刻意不把密码写在命令行里,怕进历史记录。连上先看库:

sql 复制代码
SHOW DATABASES;

图形客户端我用起来更顺手,本机一般填:

我填的值
主机 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;

我给自己标的三个坑:

  1. CHANGE COLUMN 必须带数据类型
  2. DROP COLUMN 基本不可逆(没备份就没了)
  3. USE 对库,再改表,别改到别的库

语法细节我对照:ALTER TABLE StatementCREATE 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、别名、去重
  • 我容易踩的坑:全表更新、误删,以及后面要接的事务意识

容器这篇搭完,下一篇才认真往里装数据、按条件取出来。


参考链接

  1. MySQL Community Downloads
  2. MySQL 8.0 Reference Manual
  3. Character Sets and Collations in MySQL
  4. CREATE TABLE Syntax
  5. ALTER TABLE Statement

系列:MySQL 学习笔记 · 01/05

素材:BV1qSKc6JEaH P1---P20;字幕识别错误(如把 DROP 听成 job)我已按标准 SQL 改过。

相关推荐
三言老师2 小时前
CentOS7.9:Redis 数据持久化结构化实战教程
数据库·redis·缓存
鸽芷咕2 小时前
KingbaseES 优化器底层逻辑:等价变换如何改写 SQL,条件调度如何驱动运行时
数据库
Vect__2 小时前
MySQL 内连接和外连接:从匹配关系到业务查询
数据库·mysql
qq_150841992 小时前
SQL的insert和update二合一指令
java·数据库·sql
聚焦前沿2 小时前
水动力优化导流罩:原理、数据与实船验证
大数据·服务器·数据库·人工智能
万联WANFLOW2 小时前
外贸独立站:服务器放海外国内后台卡,放国内海外客户打不开——这道两头难怎么破?
运维·网络·数据库·经验分享
金海境科技3 小时前
【服务器数据恢复】H3C CAS虚拟化平台HP存储qcow2文件损坏快照丢失数据恢复案例
服务器·数据库·经验分享
正儿八经的少年3 小时前
Spring 事务保证数据一致性
java·数据库·spring
foo1st3 小时前
MySQL 8.0(Windows)升级笔记
数据库·笔记·mysql