30 分钟
全栈开发

数据库与 SQL 基础

掌握关系型数据库设计和核心 SQL

  • 理解关系型数据库基本概念
  • 掌握 CREATE TABLE / INSERT / SELECT / UPDATE / DELETE
  • 理解表关系(一对一、一对多、多对多)
  • 掌握 JOIN 查询

关系型数据库

关系型数据库(如 PostgreSQL、MySQL)用表(Table)存储数据,表由行(Row)和列(Column)组成。表之间可以建立关系。

SQL
-- 创建用户表
CREATE TABLE users (
  id SERIAL PRIMARY KEY,        -- 自增主键
  name VARCHAR(100) NOT NULL,   -- 用户名,非空
  email VARCHAR(255) UNIQUE,    -- 邮箱,唯一
  age INTEGER DEFAULT 0,        -- 年龄,默认0
  created_at TIMESTAMP DEFAULT NOW()
);

-- 插入数据
INSERT INTO users (name, email, age)
VALUES ('小明', 'xm@test.com', 25);

-- 查询数据
SELECT * FROM users;                    -- 所有用户
SELECT name, email FROM users WHERE age > 18;  -- 成年人
SELECT * FROM users ORDER BY age DESC LIMIT 10; -- 年龄最大的10个

-- 更新
UPDATE users SET age = 26 WHERE name = '小明';

-- 删除
DELETE FROM users WHERE id = 1;

表关系

SQL
-- 一对多:一个用户有多篇文章
CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  title VARCHAR(200),
  content TEXT,
  user_id INTEGER REFERENCES users(id)  -- 外键
);

-- 多对多:文章和标签
CREATE TABLE post_tags (
  post_id INTEGER REFERENCES posts(id),
  tag_id INTEGER REFERENCES tags(id),
  PRIMARY KEY (post_id, tag_id)
);

JOIN 查询

SQL
-- INNER JOIN:查询文章及作者名
SELECT posts.title, users.name AS author
FROM posts
JOIN users ON posts.user_id = users.id;

-- LEFT JOIN:所有用户及其文章(没有文章的用户也显示)
SELECT users.name, posts.title
FROM users
LEFT JOIN posts ON users.id = posts.user_id;
🐍索引与性能

WHERE、JOIN、ORDER BY 用到的列建索引,比如 CREATE INDEX idx_posts_user ON posts(user_id)。索引能加速查询,但会减慢写入,因为要维护索引树。别过度索引,只给高频查询条件加就行。EXPLAIN ANALYZE 可以看查询执行计划。

ℹ️Python 操作数据库

Python 里别手写 SQL 字符串拼接,有 SQL 注入风险。用 ORM,比如 Django ORM、SQLAlchemy。ORM 就是用 Python 对象操作数据库,自动做参数化查询。

选择题

以下哪个 SQL 语句用于查询数据?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

穿透是反复查「根本不存在」的数据,用布隆过滤器或缓存空值挡;击穿是某个热点 key 过期瞬间大量请求压向数据库,用互斥重建或逻辑过期;雪崩是大批 key 同时过期,给 TTL 加随机抖动。缓存与库的一致性常用「先更新数据库、再删除缓存」,并靠重试/订阅补偿。

挑战任务

SQL 练习

简单+50 XP

查询年龄大于18的用户姓名和邮箱

SQL 练习
1 个测试用例

课后作业

设计博客数据库

中等+30 XP

设计博客系统的数据库表:users、posts、comments、tags,写出 CREATE TABLE 语句和关系。

设计博客数据库
1 个测试用例