🐸 青蛙编程网
首页 / 数据库 / MySQL / 8. 综合练习:博客数据表

8. 综合练习:博客数据表

这是什么:综合练习 = 把前 7 章的建表、增删改查、聚合、JOIN 全部串起来,做出一个像真博客的数据层。

为什么用:青蛙编程网的第一步就是需要一个数据库。零散学的每一条 SQL,都得落到真实场景里练一遍,才算真的会写。

如何用:本章从建 frog_blog 库开始,先建用户、文章、评论三张表,再插数据、查数据、跑统计。

8.1 目标设计

一个最小可用的博客数据层:

  1. user 表:注册用户
  2. article 表:文章,外键指向用户
  3. comment 表:评论,同时外键指向用户与文章(自测一对多关系)
  4. 插入演示数据,实践两种统计查询

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 拓展练习(选做)

  1. 加 tag 表与 article_tag 中间表,实现「文章 ↔ 标签」多对多
  2. 写一条 SQL「查出从未被人评论过的文章」(LEFT JOIN + IS NULL 套路)
  3. 把 user 表 email 加唯一索引:ALTER TABLE user ADD UNIQUE (email);,试着插重复邮箱看报错

8.7 小结

恭喜完成 MySQL 教程全部章节!你已经会:

  • 设计:一对多、主外键、逻辑删除的最小套路
  • 操作:INSERT / UPDATE / DELETE / SELECT 全套 CRUD
  • 统计:聚合函数、分组、多表 JOIN

有了数据库,去试试用 Flask 教程 把它连到真正的网页上——那一步之后,你就能做出自己的全栈博客了 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。