my+MySQL Atlas数据库学习图谱
官方手册 ↗
LEARN BY QUERYING · MYSQL 8.4

让每一条 SQL
都有清晰的答案。

从第一条 SQL 开始

筛选、排序和空值:先把问题表达成正确的查询。

示例数据查询结果动手练习
ONE DATASET, MANY QUESTIONS

准备你的练习数据 4 位客户 · 5 笔订单

+

在自己的空白练习数据库中执行。每项示例都基于初始数据独立验证;事务课程会改变数据,再次练习时请使用新的空白数据库。金额采用 DECIMAL,表使用 InnoDB。

建表与示例数据
CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(40) NOT NULL,
  nickname VARCHAR(40) NULL
) ENGINE=InnoDB;
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL,
  amount DECIMAL(10,2) NOT NULL,
  status VARCHAR(20) NOT NULL,
  ordered_at DATE NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customers(id)
) ENGINE=InnoDB;
INSERT INTO customers VALUES
  (1, 'Ada', 'ada'), (2, 'Linus', NULL),
  (3, 'Grace', 'grace'), (4, 'Guido', NULL);
INSERT INTO orders VALUES
  (1, 1, 120.00, 'paid', '2026-01-02'),
  (2, 1, 80.00, 'paid', '2026-01-05'),
  (3, 2, 200.00, 'pending', '2026-01-06'),
  (4, 2, 50.00, 'paid', '2026-01-07'),
  (5, 3, 150.00, 'paid', '2026-01-09');
下载 dataset.sql ↓
THE PRACTICE

查询基础 03

结果基于统一数据集;计划与锁行为需结合实际环境
01MySQL 8.0 · MySQL 8.4

筛选与稳定排序

找出已支付且金额至少 100 元的订单,再按金额从高到低查看。

常见做法取出所有订单,在应用中筛选和排序,会多传输不需要的数据。

注意事项

LIMIT 不保证排序;需要稳定分页时加入唯一的排序键。条件中的字符串使用单引号。

官方依据 ↗核对于 2026-10-06
SQL
SELECT id, amount
FROM orders
WHERE status = 'paid' AND amount >= 100
ORDER BY amount DESC, id;

示例结果

idamount
5150.00
1120.00

动手练习

只返回金额最高的一笔已支付订单。

查看参考答案 +

在 ORDER BY 后增加 LIMIT 1,结果为订单 5。

02MySQL 8.0 · MySQL 8.4

正确判断 NULL

NULL 表示缺失或未知,使用 IS NULL 查找没有昵称的客户。

常见做法写 nickname = NULL 不会得到预期的真值,应使用空值判断。

注意事项

空字符串和 NULL 不同;COUNT(列) 忽略 NULL,而 COUNT(*) 统计行数。

官方依据 ↗核对于 2026-10-06
SQL
SELECT id, name
FROM customers
WHERE nickname IS NULL
ORDER BY id;

示例结果

idname
2Linus
4Guido

动手练习

显示所有客户的昵称,没有昵称时显示 name。

查看参考答案 +

SELECT COALESCE(nickname, name) AS display_name FROM customers ORDER BY id;

03MySQL 8.0 · MySQL 8.4

用 CASE 表达业务分组

把金额至少 150 元的订单标记为 large,其余标记为 regular。

常见做法在应用里维护另一套分支逻辑,不容易与查询结果一起聚合。

注意事项

CASE 从前到后选择第一个满足的分支;未匹配且没有 ELSE 时结果为 NULL。

官方依据 ↗核对于 2026-10-06
SQL
SELECT id,
  CASE WHEN amount >= 150 THEN 'large'
       ELSE 'regular' END AS size
FROM orders
ORDER BY id;

示例结果

idsize
1regular
2regular
3large
4regular
5large

动手练习

让未支付订单优先显示 pending,再判断金额。

查看参考答案 +

把 WHEN status <> 'paid' THEN 'pending' 放在金额判断之前。

FROM THE SOURCE

版本与官方更新

自动检查官方发布索引;中文课程由维护者核对更新。