⌨️ 第六章 Web技术与安全
📄 本篇一句话

DBMS 是管理数据的软件(存、查、护),SQL 是跟它打交道的统一语言(声明要什么,不管怎么拿)——你描述「结果」,它负责「路径」。

📝 在本章的位置

数据库课(15. 🗄️)已经用整本书讲透本篇;这里收拢成 Web 视角的一页:动态网站(6-5)的数据从哪来、API(6-15)背后查什么、6-11 的一致性靠谁保障。

一、DBMS:数据的管家

DBMS(Database Management System,数据库管理系统)=专门管数据的软件:存取、索引(快的功劳)、权限、备份、事务(6-11)全包。Web 世界三巨头:

二、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 = '波仔';                               -- 删

三、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/聚合三招,覆盖日常查询八成。

常见误区

自测三问(点击展开) 1. **SQL「声明式」是什么意思?** 答:只描述要什么结果,不写怎么取的步骤;路径由 DBMS 优化器决定。 2. **SQLite 与 MySQL 的定位差别?** 答:SQLite 零配置单文件(嵌入式、小工具);MySQL/MariaDB 常驻服务、扛并发(网站后端)。 3. **SQL 注入怎么防?** 答:参数化查询(占位符),永远不把用户输入直接拼进 SQL。

相关笔记