数据库是什么:零基础认识数据的世界
面向零基础读者建立数据库、表、行、列、DBMS 的完整心智模型,理解为什么不用文件和 Excel 存数据,并写出第一条查询语句。
1. 为什么程序都需要数据库
用变量存数据有个致命问题:程序一关,数据就没了(变量在内存里,断电即失)。 写进文件呢?数据是留下了,但新的问题立刻出现:
- 找得慢:100 万个用户里找一个邮箱,文件只能从头读到尾逐条比对;
- 改得险:两个用户同时下单,两个程序同时写同一个文件,数据可能互相覆盖;
- 容易坏:写到一半断电,文件留下半条残缺记录,程序下次读到就出错。
真实应用的用户账号、订单、文章,必须存到一个”断电不丢、可并发读写、能快速检索” 的地方——这就是数据库(Database)。
类比:文件像一张张散落的纸质笔记,数据库像一座有编目系统、有管理员、 有防火保险柜的图书馆——你按书名一查,管理员几毫秒内把书递到你手上。
2. 三个名词先分清:数据库、DBMS、SQL
初学者最容易混的三个词,用图书馆类比一次分清:
| 名词 | 全称 | 角色 | 图书馆类比 |
|---|---|---|---|
| 数据库 | Database | 按一定结构组织的数据集合 | 馆藏的图书本身 |
| DBMS | Database Management System,数据库管理系统 | 管理数据的软件 | 图书馆 + 管理员 |
| SQL | Structured Query Language,结构化查询语言 | 操作数据的语言 | 借书单的固定格式 |
平时说”装个 MySQL”,装的其实是 DBMS(数据库管理软件);“公司数据库里有 100 万用户”, 说的是数据本身。MySQL、PostgreSQL、SQLite、SQL Server、Oracle 都是常见的 DBMS。
3. 表、行、列:关系型数据库的世界观
关系型数据库(Relational Database)把数据组织成一张张二维表(table)。
看一张用户表 users:
id | name | email | city | registered_at
---|-------|----------------|------|--------------------
1 | 张三 | zhang@ex.com | 北京 | 2025-01-10
2 | 李四 | li@ex.com | 上海 | 2025-02-03
3 | 王五 | wang@ex.com | 北京 | 2025-03-21
每个部分都有专门的术语,必须一次记牢:
- 列(column),也叫字段(field):一列是一种属性,如
name、email。 每列有确定的数据类型(文本、整数、日期等),建表时就要声明——这保证了 “邮箱列里不会混进一个数字”。 - 行(row),也叫记录(record):一行是一条完整的数据,代表一个用户。
- 主键(primary key):能唯一标识一行的列(或列组合),如
id。 就像身份证号——可以重名,但不能有两个人的身份证号相同。主键是后续 更新、删除、表与表关联的基石。
“关系型”得名于数学里的”关系(relation)“——一张表就是一个关系。这个模型 1970 年由 IBM 的 E.F. Codd 提出,至今仍是全世界数据存储的主流形态。
表与表怎么关联:外键的直觉
真实业务的数据从来不是一张大表。把用户和订单拆成两张表,用 user_id 把它们连起来:
users orders
id | name id | user_id | product | amount
---|------- ---|---------|---------|-------
1 | 张三 501| 1 | 键盘 | 399.00
2 | 李四 502| 1 | 鼠标 | 199.00
503| 2 | 显示器 | 1299.00
orders.user_id 指向 users.id,这样的列叫外键(foreign key)。
查询”张三的所有订单”就是:先在 users 里找到张三的 id = 1,再到 orders 里
找所有 user_id = 1 的行。这个”按 id 连接两张表”的动作,正是 SQL 中
JOIN(连接)的日常——sql 模块后面会花大量篇幅讲它。
为什么拆表而不是把所有信息塞一张大表?因为拆开后每类事实只存一份:
用户改了邮箱,只改 users 一行,几十万条订单不会留下旧邮箱的副本。
这套消除冗余的设计思路叫规范化(normalization)。
4. 文件、Excel、数据库:到底差在哪
| 能力 | 普通文件 | Excel | 数据库(DBMS) |
|---|---|---|---|
| 断电不丢 | 是 | 是 | 是 |
| 百万行中按条件查找 | 逐行扫描,秒级到分钟级 | 卡顿明显 | 毫秒级(B-Tree 索引) |
| 多人同时读写 | 互相覆盖 | 单人编辑锁全表 | 行级锁 + 事务,互不干扰 |
| 部分失败自动撤销 | 做不到 | 手工 Ctrl+Z | 事务回滚(ROLLBACK) |
| 类型与约束 | 无 | 弱(单元格格式) | 强(类型、唯一、外键、CHECK) |
| 权限控制 | 文件级 | 文件级 | 精确到”某人只能读某表某列” |
| 远程访问/并发连接 | 需自建 | 困难 | 内置网络协议,数千连接 |
一句话总结:数据量小、单人使用,Excel 足够;一旦”多人、并发、海量、要求不出错” 四个条件占了两个,就该上数据库。
5. SQL:与数据库对话的语言
SQL(Structured Query Language,结构化查询语言)是操作关系型数据库的标准语言, 1986 年起就是 ANSI/ISO 国际标准。它最大的特点是声明式:你描述”要什么”, 不需要写”怎么拿”。
-- 从用户表里找出所有北京的用户,按注册时间倒序
SELECT name, email FROM users
WHERE city = '北京'
ORDER BY registered_at DESC;
一行读法:从 users 表(FROM)选出姓名与邮箱(SELECT),条件是城市为北京(WHERE),
按注册时间倒序排列(ORDER BY)。没有循环、没有变量管理,四五个关键词就是一次
完整的查询。 对比用普通语言实现”从百万行文件里过滤加排序”要写的循环和临时变量,
你会立刻理解为什么 SQL 四十多年长盛不衰。
这条语句的预期输出(对应第 3 节的示例数据):
name | email
张三 | zhang@ex.com
王五 | wang@ex.com
王五排在张三前面(注册更晚),李四因不在北京被过滤。
6. SQL 语言的四大家族
SQL 语句按用途分四类,本模块也基本按这个骨架展开:
| 类别 | 关键词 | 用途 |
|---|---|---|
| DQL 查询 | SELECT | 检索数据(日常使用占八成) |
| DML 操作 | INSERT、UPDATE、DELETE | 增、改、删数据 |
| DDL 定义 | CREATE、ALTER、DROP | 建表、改结构 |
| DCL 控制 | GRANT、REVOKE | 权限管理 |
另有管理事务的 BEGIN / COMMIT / ROLLBACK(常称 TCL)。初学阶段把 SELECT
练熟,其余族类的关键词见到能认出来即可。
7. 关系型之外:NoSQL 是什么
不是所有数据都适合表格。NoSQL 泛指不使用关系模型的数据库,常见四类:
| 类型 | 代表 | 擅长的数据 |
|---|---|---|
| 文档型 | MongoDB | 结构灵活、嵌套深的对象(如商品详情) |
| 键值型 | Redis | 缓存、会话、计数器等”按 key 取 value” |
| 时序型 | InfluxDB | 传感器、监控指标等按时间追加的数据 |
| 图数据库 | Neo4j | 社交关系、风控关系网络等深度关联 |
关系型与 NoSQL 是互补而非替代:绝大多数业务系统以关系型数据库为核心, 把缓存、日志等特定场景交给对应 NoSQL。零基础阶段先把 SQL 主线学扎实。
8. 动手环节:不用安装就能跑 SQL
打开浏览器访问在线 SQL 练习环境(搜索 SQLite Online 或 SQL Fiddle),建一张练习表:
CREATE TABLE students ( -- 建表:三列,id 整数、name 文本、score 整数
id INTEGER,
name TEXT,
score INTEGER
);
INSERT INTO students VALUES (1, '张三', 88); -- 插入三行练习数据
INSERT INTO students VALUES (2, '李四', 92);
INSERT INTO students VALUES (3, '王五', 79);
然后查询:
SELECT * FROM students ORDER BY score DESC;
-- 星号表示"所有列",预期输出(按分数从高到低):
-- id | name | score
-- 2 | 李四 | 92
-- 1 | 张三 | 88
-- 3 | 王五 | 79
把 ORDER BY score DESC 的 DESC 删掉再跑一次,观察顺序变化——
改一个词、看一次结果,是学 SQL 最好的节奏。再试两条:
SELECT name FROM students WHERE score >= 85; -- 条件过滤:张三、李四
SELECT COUNT(*) FROM students; -- 计数:3
9. 常见困惑
“MySQL 和 SQL 是什么关系?“——SQL 是语言,MySQL/PostgreSQL 是使用这门语言的 数据库软件(就像”英语”与”英国人、美国人”的关系)。各家软件对标准的实现有差异 (方言),但核心语法通用,学一次处处可用。
“数据库和大数据是一回事吗?“——不是。数据库(如 MySQL)面向业务系统的高频 读写,单机就能扛住绝大多数应用;大数据(Hadoop、Spark)面向海量历史数据的批量 分析,是另一套技术栈。学习路线上先数据库后大数据。
“写 SQL 会不会把数据弄坏?“——练习环境随便折腾;生产环境遵循”重要操作前备份、 删除前先 SELECT 确认、更新删除必带 WHERE”的工程规范,后续事务章节(TCL)会讲 用事务给危险操作留后悔药。
10. 下一步与小结
进入 SQL 概述与标准 开始语法主线;想搭建本地数据库 环境,接着读 MySQL 模块 的环境章节。
小结:
- 初学者要点:数据库 = 结构化存储 + 快速检索 + 并发安全;核心概念只有五个——
表、行、列、主键、外键;SQL 是声明式语言,
SELECT ... FROM ... WHERE是万能起手式。 - 进阶注意:DBMS 是软件、数据库是数据集合,两者别混称;表结构设计(拆表与外键) 决定了系统的可维护性,“先想清楚表怎么建,再想查询怎么写”是重要习惯; 关系型是主线,NoSQL 按场景补充。