📄 本篇一句话
DBMS 是管理数据的软件(存、查、护),SQL 是跟它打交道的统一语言(声明要什么,不管怎么拿)——你描述「结果」,它负责「路径」。
📝 在本章的位置
数据库课(15. 🗄️)已经用整本书讲透本篇;这里收拢成 Web 视角的一页:动态网站(6-5)的数据从哪来、API(6-15)背后查什么、6-11 的一致性靠谁保障。
一、DBMS:数据的管家
DBMS(Database Management System,数据库管理系统)=专门管数据的软件:存取、索引(快的功劳)、权限、备份、事务(6-11)全包。Web 世界三巨头:
- MySQL/MariaDB:开源首选,WordPress 全世界的网站托着它(树莓派课 5-3 装的 MariaDB 就是 MySQL 的社区分支)。
- PostgreSQL:功能最全的开源关系库,复杂查询与扩展性之王。
- SQLite:一个文件就是一个库——手机 App、浏览器、Python 标准库里都内置;本篇 Demo 就用它,零安装。
二、SQL:声明式的统一语言
SQL(Structured Query Language)四大动词包打天下(数据库课第三章 22 篇的浓缩版):
CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT, score REAL); -- 建
INSERT INTO students (name, score) VALUES ('波仔', 88.5); -- 增
SELECT name, score FROM students WHERE score > 80 ORDER BY score DESC; -- 查
UPDATE students SET score = 91 WHERE name = '波仔'; -- 改
DELETE FROM students WHERE name = '波仔'; -- 删
- 声明式的独特气质:你说「要 score > 80 的、按分数倒序」,不用写循环(对比 4-11 手写排序)——怎么用索引、走什么路径,DBMS 的查询优化器负责。
- 统一的价值:会 SQL 一门,MySQL/PostgreSQL/SQLite 通用(方言差异是小头);换个语言(Python/PHP/Java)也是这几句——数据层的「普通话」。
三、Web 应用里的位置
浏览器 → 后端程序(PHP/Python/…) → SQL → DBMS → 硬盘
↑ API(6-15) ↑ 事务/锁(6-11)
后端代码的任务就是「接请求 → 拼 SQL → 把结果转成 JSON(6-9)回去」。安全红线教材反复强调:SQL 注入=把用户输入当 SQL 拼接,防法只有参数化查询(数据库课 7-10、2026 年仍是 OWASP 常客)。
动手 Demo:Python 内置 SQLite,五行建库查数
import sqlite3
con = sqlite3.connect(":memory:") # 内存库:退出即消失,随便玩
cur = con.cursor()
cur.execute("CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT, score REAL)")
cur.executemany("INSERT INTO students (name, score) VALUES (?, ?)",
[("波仔", 88.5), ("小红", 92), ("小明", 75)])
for name, score in cur.execute(
"SELECT name, score FROM students WHERE score > 80 ORDER BY score DESC"):
print(f"{name} {score}")
con.close()
看到什么算成功:
小红 92.0
波仔 88.5
读结果:零安装、零配置,Python 标准库自带 DBMS——? 占位符就是参数化查询的写法(注入防线从第一课就养成)。
30 秒实验
把上一 Demo 的查询换成 SELECT name, score FROM students WHERE score > 80 ORDER BY score DESC LIMIT 1——只回最高分。再换成 SELECT COUNT(*), AVG(score) FROM students——计数+平均(数据库课 3-17 的 AVG:分母是有值的行数)。WHERE/LIMIT/聚合三招,覆盖日常查询八成。
常见误区
- 「NoSQL 出现了,SQL 过时了」——NoSQL 解决特定场景(海量、灵活结构),结构化数据的核心阵地仍是关系库;数据库课第二章讲过「四族各管一段」。
- 「SELECT 很危险随便跑」——忘 WHERE 的 UPDATE/DELETE 全表遭殃(数据库课必记);生产库操作先在测试库演练。
- 「拼字符串查库无所谓」——
"SELECT ... WHERE name = '" + user_input + "'"一句'; DROP TABLE --就能毁库;参数化查询是唯一正解。
自测三问(点击展开)
1. **SQL「声明式」是什么意思?** 答:只描述要什么结果,不写怎么取的步骤;路径由 DBMS 优化器决定。 2. **SQLite 与 MySQL 的定位差别?** 答:SQLite 零配置单文件(嵌入式、小工具);MySQL/MariaDB 常驻服务、扛并发(网站后端)。 3. **SQL 注入怎么防?** 答:参数化查询(占位符),永远不把用户输入直接拼进 SQL。- ☑ 6-10 完成 —— 管家与普通话:DBMS+SQL
- ☐ 下一节 6-11 并发控制、独占控制、事务、死锁
相关笔记
- 数据库 3-16 · MAX/MIN —— SQL 实操全景的一角
- 数据库 7-7 · 索引 —— 「快」的功臣
- 树莓派 5-3 · MariaDB —— 真机装过一次 DBMS
- ⌨️ 编程原理 · 索引 —— 全课路线图