从零掌握数据库:CRUD、联表、分组查询
一、什么是 CRUD?
CRUD 是四个英文单词的首字母缩写,代表数据库中最基础的四种操作:
- Create(创建/插入)
- Read(读取/查询)
- Update(更新)
- Delete(删除)
这些操作构成了绝大多数应用程序与数据库交互的核心。
1. Create(INSERT)
向表中插入新记录。
INSERT INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 28);
2. Read(SELECT)
查询数据是最常用的操作。
基础查询
SELECT * FROM users;
条件查询(WHERE)
SELECT name, email FROM users WHERE age > 25;
排序(ORDER BY)
SELECT * FROM users ORDER BY age DESC;
限制结果数量(LIMIT / TOP)
-- MySQL / SQLite
SELECT * FROM users LIMIT 5;-- SQL Server
SELECT TOP 5 * FROM users;
3. Update(UPDATE)
修改已有记录。
UPDATE users
SET email = 'newemail@example.com'
WHERE id = 1;
⚠️ 警告:务必加上 WHERE 条件!否则会更新整张表!
4. Delete(DELETE)
删除记录。
DELETE FROM users WHERE age < 18;
警告:务必加上 WHERE 条件!否则会导致整表数据被清空!
二、联表查询(JOIN)
联表查询(JOIN) 是在查询时,把两个或多个表按照某个“关联字段”组合在一起,从而同时获取多个表中的信息。
常见应用场景:
- 查询订单时,把用户信息一起查出来
- 查询学生课程成绩时,把课程名称同时查出来
- 查询文章时,把作者信息联查显示
1.联表查询的核心思想
所有 JOIN 的本质:
“根据两个表的关联字段(通常是主键/外键)进行匹配,把相关的行拼在一起。”
常见关联字段例子:
- orders.user_id = users.id
- student.class_id = class.id
- product.category_id = category.id
2.JOIN 的类型(最常用的 3 类)
以下示例假设有两个表:
users(用户表)
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
orders(订单表)
| id | user_id | amount |
|---|---|---|
| 1 | 1 | 100 |
| 2 | 1 | 200 |
| 3 | 2 | 300 |
1️⃣ INNER JOIN(内连接)— 只保留两边都匹配的
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
查询结果:
| name | amount |
|---|---|
| 张三 | 100 |
| 张三 | 200 |
| 李四 | 300 |
特点:
只显示“有订单的用户”,王五没有订单,所以不会出现。
2️⃣ LEFT JOIN(左连接)— 保留左表全部,右表没有则 NULL
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
结果:
| name | amount |
|---|---|
| 张三 | 100 |
| 张三 | 200 |
| 李四 | 300 |
| 王五 | NULL |
特点:
左表(users)全部保留,没有匹配的地方显示 NULL。
常用于:
- 查询所有用户,即使没下过订单
- 查询所有学生,即使没选过课
3️⃣ RIGHT JOIN(右连接)— 保留右表全部
(和 LEFT JOIN 反过来)
SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
结果与 INNER JOIN 一样(因为 orders 全都有匹配),但通常实际开发里 很少用 RIGHT JOIN,一般用 LEFT JOIN 完成同样效果。
3.多表联查(3 张或更多表)
假设我们有三张表:
1. 用户表 users
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
2. 订单表 orders
| id | user_id | product_id |
|---|---|---|
| 101 | 1 | 201 |
| 102 | 1 | 202 |
3. 商品表 products
| id | name | category |
|---|---|---|
| 201 | iPhone | 电子产品 |
| 202 | 咖啡杯 | 日用品 |
💡 目标:查出每个订单对应的用户名和商品名
理解逻辑:分步连接
第一步:users 和 orders 连接
通过 users.id = orders.user_id,得到:
| name | order_id | product_id |
|---|---|---|
| 张三 | 101 | 201 |
| 张三 | 102 | 202 |
第二步:把上一步结果 和 products 连接
通过 product_id = products.id,得到最终结果:
| name | product_name |
|---|---|
| 张三 | iPhone |
| 张三 | 咖啡杯 |
✅ 数据库内部就是这样一步步“嵌套连接”的,只是 SQL 语法让我们可以一次性写完。
按照顺序查找,第一次联表查询的表作为新表与下一个连接的表进行联表表查询
SELECT u.name AS 用户名,p.name AS 商品名
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;
三、分组查询(GROUP BY)与聚合函数
你查询什么字段,查询的字段就作为一列
分组查询用于把数据按某个字段分组,并对每组分别进行统计。
直白理解:
GROUP BY = “把相同字段的行归成一组,再对每组统计一次”。
常用于:
- 统计每个部门有多少员工
- 统计每类商品的销量
- 统计每个用户下了多少订单
- 按日期统计每日访问量
1.常见聚合函数(必须记住)
聚合函数是对“每组数据”做统计的函数。
| 函数 | 作用 |
|---|---|
| COUNT() | 统计数量 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
必须记住:
聚合函数 只对每一组 生效
非聚合字段 必须出现在 GROUP BY 之后
2.最基本的 GROUP BY 示例
假设 orders 表:
| user_id | amount |
|---|---|
| 1 | 100 |
| 1 | 200 |
| 2 | 300 |
查询每个用户的消费总额:
SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id;
结果:
| user_id | total_amount |
|---|---|
| 1 | 300 |
| 2 | 300 |
3.SQL 分组查询(GROUP BY)与聚合函数 —— 总结总表
| 功能 | 语法示例 | 说明 | 典型结果或用途 |
|---|---|---|---|
| 按字段分组 | GROUP BY user_id | 把同一用户的订单归为一组 | 每用户一行 |
| 统计数量(COUNT) | COUNT(*) | 统计每组行数 | 订单数、访问量 |
| 求和(SUM) | SUM(amount) | 求每组字段总和 | 每用户总消费 |
| 平均值(AVG) | AVG(score) | 每组平均数 | 平均成绩、平均金额 |
| 最大/最小(MAX/MIN) | MAX(price) / MIN(price) | 每组最大/最小 | 最高订单金额 |
| 分组前过滤(WHERE) | WHERE amount > 100 | 过滤原始数据 | 只统计大额订单 |
| 分组后过滤(HAVING) | HAVING COUNT(*) > 5 | 过滤聚合后的结果 | 只显示下单≥5次的用户 |
| 分组 + 排序(ORDER BY) | ORDER BY total DESC | 按聚合结果排序 | 从高到低显示统计值 |
| 多字段分组 | GROUP BY user_id, date | 多维统计 | 每用户每天订单数 |
| JOIN + GROUP BY | JOIN ... GROUP BY u.id | 先联表拼数据,再统计 | 统计用户订单数最常见 |
| SELECT 中非聚合字段必须出现在 GROUP BY 中 | ✔ 正确:SELECT user_id, COUNT(*) FROM orders GROUP BY user_id | SQL 规则 | 避免报错 |
| 完整常见结构(最重要) | SELECT… FROM… WHERE… GROUP BY… HAVING… ORDER BY… | SQL 执行顺序 | 必背口诀 |
SQL 分组查询顺序
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- WHERE:分组前过滤
- GROUP BY:进行分组
- HAVING:分组后的过滤
- ORDER BY:最后排序
四、数据库基础核心概念总结
| 概念 | 核心含义 | 关键点 | 实际应用场景 |
|---|---|---|---|
| CRUD | 数据库最基本的四类操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete) | ✔ 是所有数据库应用的基础 ✔ Web、后台、接口开发必用 ✔ SQL 对应 INSERT / SELECT / UPDATE / DELETE | - 用户注册:Create - 查询列表:Read - 修改资料:Update - 删除订单:Delete |
| JOIN | 多表之间按关联字段进行连接查询 | ✔ LEFT JOIN 保留左表全部数据 ✔ INNER JOIN 只保留两表都匹配的部分 ✔ 多表关联时要清楚主外键关系 | - 订单关联用户信息 - 学生关联班级 - 文章关联作者 |
| GROUP BY | 将相同字段的行分组,再对每组做统计 | ✔ 搭配聚合函数:COUNT / SUM / AVG / MAX / MIN ✔ HAVING 用于过滤分组后的结果 ✔ SELECT 中非聚合字段必须出现在 GROUP BY 中 | - 每类商品总销量<br- 每个用户订单数量 - 每天访问量统计 |
