前置知识: 计算机基础

数据库是什么:零基础认识数据的世界

8 min入门

面向零基础读者建立数据库、表、行、列、DBMS 的完整心智模型,理解为什么不用文件和 Excel 存数据,并写出第一条查询语句。

1. 为什么程序都需要数据库

用变量存数据有个致命问题:程序一关,数据就没了(变量在内存里,断电即失)。 写进文件呢?数据是留下了,但新的问题立刻出现:

  • 找得慢:100 万个用户里找一个邮箱,文件只能从头读到尾逐条比对;
  • 改得险:两个用户同时下单,两个程序同时写同一个文件,数据可能互相覆盖;
  • 容易坏:写到一半断电,文件留下半条残缺记录,程序下次读到就出错。

真实应用的用户账号、订单、文章,必须存到一个”断电不丢、可并发读写、能快速检索” 的地方——这就是数据库(Database)。

类比:文件像一张张散落的纸质笔记,数据库像一座有编目系统、有管理员、 有防火保险柜的图书馆——你按书名一查,管理员几毫秒内把书递到你手上。

2. 三个名词先分清:数据库、DBMS、SQL

初学者最容易混的三个词,用图书馆类比一次分清:

名词全称角色图书馆类比
数据库Database按一定结构组织的数据集合馆藏的图书本身
DBMSDatabase Management System,数据库管理系统管理数据的软件图书馆 + 管理员
SQLStructured 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 按场景补充。