跳到主要内容

MySQL 零基础入门教程 —— 第三阶段:进阶查询与函数

本阶段是 SQL 技能提升最大的阶段。你将学会 分组统计、聚合函数、多表联查 —— 这是从“小白”迈向“能独立处理数据”的关键能力。


📌 1. 聚合函数(统计类函数)

聚合函数(Aggregate Functions)用于 对多行数据进行统计,非常常用。

常见的有:

  • COUNT():统计数量
  • SUM():求和
  • AVG():平均值
  • MAX():最大值
  • MIN():最小值

示例:统计用户数量

SELECT COUNT(*) FROM users;

示例:计算用户的平均年龄

SELECT AVG(age) FROM users;

示例:找最大年龄

SELECT MAX(age) FROM users;

📌 2. 分组查询(GROUP BY)

GROUP BY 用于把数据按某个字段分类,比如“每个年龄段有多少人”。

为了演示,我们先为 users 表增加一个字段:

ALTER TABLE users ADD gender VARCHAR(10);

再随便更新一些性别:

UPDATE users SET gender = 'female' WHERE name = 'Alice';
UPDATE users SET gender = 'male' WHERE name = 'Bob';
UPDATE users SET gender = 'male' WHERE name = 'Charlie';

示例:统计每种性别有多少用户

SELECT gender, COUNT(*)
FROM users
GROUP BY gender;

结果大概像:

female | 1
male | 2

示例:统计每种性别的平均年龄

SELECT gender, AVG(age)
FROM users
GROUP BY gender;

📌 3. 分组过滤(HAVING)

HAVING 用来“过滤分组后的结果”。

示例:只保留人数大于 1 的性别

SELECT gender, COUNT(*)
FROM users
GROUP BY gender
HAVING COUNT(*) > 1;

WHERE 是分组前过滤,HAVING 是分组后过滤。


📌 4. 多表联合查询(JOIN)—— 本章最关键

JOIN 是 SQL 的灵魂之一。

为了讲解,我们先创建一张订单表:

CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
amount DECIMAL(10,2),
order_time DATETIME
);

插入一些订单:

INSERT INTO orders (user_id, amount, order_time) VALUES
(1, 100.50, NOW()),
(2, 250.00, NOW()),
(1, 80.00, NOW());

📌 5. INNER JOIN(最常用)

查询用户及对应订单:

SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

解释:

  • users.id = orders.user_id 是匹配条件
  • 只有有订单的用户才会出现

结果示例:

Alice | 100.50
Bob | 250.00
Alice | 80.00

📌 6. LEFT JOIN(保留左表全部数据)

即使用户没有订单,也会显示。

SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

结果示例:

Alice  | 100.50
Bob | 250.00
Alice | 80.00
Charlie| NULL

Charlie 虽然没有订单,但也会被查出来。


📌 7. RIGHT JOIN(了解即可)

保留右表的全部记录,但实际用得少。


📌 8. 多表 JOIN(进阶)

如果以后你遇到 3~5 张表联查,不要慌,就是把 JOIN 继续往后接即可:

SELECT ...
FROM A
JOIN B ON ...
JOIN C ON ...
JOIN D ON ...;

📌 9. 子查询(Subquery)

当一个查询需要依赖另一个查询的结果时,用子查询。

示例:查询“平均年龄以上”的用户

SELECT *
FROM users
WHERE age > (
SELECT AVG(age) FROM users
);

非常常用!

示例:查出订单金额 > 所有订单平均金额的订单

SELECT *
FROM orders
WHERE amount > (
SELECT AVG(amount) FROM orders
);

📌 10. 小结(你现在已经能做的事情)

通过本阶段,你已经学会:

  • 使用聚合函数统计数据(COUNT/SUM/AVG)
  • 用 GROUP BY 分组
  • 用 HAVING 过滤分组结果
  • 多表联合查询(JOIN)
  • 子查询(Subquery)

这些能力已经足够你应对 90% 的业务数据库查询工作

下一阶段我们将学习:

如何像架构师一样设计数据库表结构(字段类型、主键、外键、约束等)