8. 综合练习:博客数据表
这是什么:综合练习 = 把前 7 章的建表、增删改查、聚合、JOIN 全部串起来,做出一个像真博客的数据层。
为什么用:青蛙编程网的第一步就是需要一个数据库。零散学的每一条 SQL,都得落到真实场景里练一遍,才算真的会写。
如何用:本章从建 frog_blog 库开始,先建用户、文章、评论三张表,再插数据、查数据、跑统计。
8.1 目标设计
一个最小可用的博客数据层:
- user 表:注册用户
- article 表:文章,外键指向用户
- comment 表:评论,同时外键指向用户与文章(自测一对多关系)
- 插入演示数据,实践两种统计查询
8.2 建库建表
CREATE DATABASE IF NOT EXISTS frog_blog DEFAULT CHARSET utf8mb4;
USE frog_blog;
CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`email` VARCHAR(150) NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
CREATE TABLE `article` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(150) NOT NULL,
`content` TEXT,
`views` INT DEFAULT 0,
`is_deleted` BOOLEAN DEFAULT 0, -- 逻辑删除标志
`user_id` INT NOT NULL, -- 外键:作者
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
CREATE TABLE `comment` (
`id` INT NOT NULL AUTO_INCREMENT,
`text` VARCHAR(500) NOT NULL,
`user_id` INT NOT NULL, -- 谁写的评论
`article_id` INT NOT NULL, -- 评论哪篇文章
PRIMARY KEY (`id`)
);
8.3 填充演示数据
INSERT INTO `user` (`username`, `email`) VALUES
('frog', 'frog@example.com'),
('panda', 'panda@example.com');
INSERT INTO `article` (`title`, `views`, `user_id`) VALUES
('从零学前端:HTML 入门', 120, 1),
('CSS 才是网页的灵魂', 85, 1),
('MySQL 练手记', 40, 2);
INSERT INTO `comment` (`text`, `user_id`, `article_id`) VALUES
('写得很清楚!', 2, 1),
('顶一个', 1, 1),
('受教了', 2, 2);
8.4 实战查询(试着自己先写,再对照)
1. 文章热榜:作者名 + 文章标题,按阅读量倒序前 3
SELECT u.`username`, a.`title`, a.`views`
FROM `article` a
JOIN `user` u ON a.`user_id` = u.`id`
WHERE a.`is_deleted` = 0
ORDER BY a.`views` DESC
LIMIT 3;
2. 每个用户的文章数 + 平均阅读量(没写文章也算 0)
SELECT u.`username`,
COUNT(a.`id`) AS `文章数`,
IFNULL(AVG(a.`views`), 0) AS `平均阅读量`
FROM `user` u
LEFT JOIN `article` a ON a.`user_id` = u.`id`
GROUP BY u.`id`, u.`username`;
你会看到:
+----------+--------+--------------+
| username | 文章数 | 平均阅读量 |
+----------+--------+--------------+
| frog | 2 | 102.5000 |
| panda | 1 | 40.0000 |
+----------+--------+--------------+
3. 每篇文章几条评论(三表 JOIN 初尝)
SELECT a.`title`, COUNT(c.`id`) AS `评论数`
FROM `article` a
LEFT JOIN `comment` c ON c.`article_id` = a.`id`
GROUP BY a.`id`, a.`title`;
8.5 技术点对照表
| 用了什么 | 在哪学的 |
|---|---|
| 建库建表 / 主键 / utf8mb4 | 第 2、3 章 |
| 外键 + 一对多关系设计 | 第 7 章 |
逻辑删除 is_deleted |
第 4 章 |
| WHERE / ORDER BY / LIMIT | 第 5 章 |
| COUNT / AVG + GROUP BY | 第 6 章 |
| LEFT JOIN 统计与 IFNULL | 第 7 章 |
8.6 拓展练习(选做)
- 加
tag表与article_tag中间表,实现「文章 ↔ 标签」多对多 - 写一条 SQL「查出从未被人评论过的文章」(LEFT JOIN + IS NULL 套路)
- 把 user 表
email加唯一索引:ALTER TABLE user ADD UNIQUE (email);,试着插重复邮箱看报错
8.7 小结
恭喜完成 MySQL 教程全部章节!你已经会:
- 设计:一对多、主外键、逻辑删除的最小套路
- 操作:INSERT / UPDATE / DELETE / SELECT 全套 CRUD
- 统计:聚合函数、分组、多表 JOIN
有了数据库,去试试用 Flask 教程 把它连到真正的网页上——那一步之后,你就能做出自己的全栈博客了 🐸