Skip to content

5.3 — 子查询基础

你将学习

  • 什么是子查询及其作用
  • 如何使用子查询进行动态筛选
  • 子查询的Excel类比

什么是子查询?

子查询是嵌套在另一个查询中的查询。它允许您将一个查询的结果作为另一个查询的输入——类似于在Excel中使用辅助表或公式。

示例数据表

sales表:

ProductAmountSaleDate
Apples1202024-05-01
Oranges802024-05-01
Bananas502024-05-02
Pears602024-05-02
Grapes902024-05-03

featured_products表:

Product
Apples
Oranges

discontinued_products表:

Product
Bananas
Grapes
NULL

示例:使用子查询筛选

显示销售额高于平均水平的销售记录:

sql
SELECT *
FROM sales
WHERE Amount > (
  SELECT AVG(Amount)
  FROM sales
);
  • 子查询计算平均销售额
  • 主查询返回销售额高于该平均值的记录

示例:在IN中使用子查询

显示特定产品列表中的销售记录:

sql
SELECT *
FROM sales
WHERE Product IN (
  SELECT Product
  FROM featured_products
);
  • 子查询从另一个表中返回产品列表

示例:在NOT IN中使用子查询

显示不在特定产品列表中的销售记录:

sql
SELECT *
FROM sales
WHERE Product NOT IN (
  SELECT Product
  FROM discontinued_products
);
  • 子查询返回已停产产品列表
  • 主查询返回不在该列表中的产品销售记录

⚠️ 关于NULL值的警告:
如果子查询返回任何NULL值,NOT IN将不会返回任何行!
这是因为对于任何值来说,Product NOT IN (包含NULL的列表)永远不会为TRUE

如何避免问题:
在子查询中始终过滤掉NULL值:

sql
SELECT *
FROM sales
WHERE Product NOT IN (
  SELECT Product
  FROM discontinued_products
  WHERE Product IS NOT NULL
);

或者使用COALESCE设置默认值

sql
SELECT *
FROM sales
WHERE Product NOT IN (
  SELECT COALESCE(Product, '???')
  FROM discontinued_products
);

关键要点

  • 子查询使您的筛选更加动态和强大
  • 它们可以在WHEREINEXISTS甚至SELECT子句中使用

下一步

接下来,您将学习如何将Excel工作流迁移到SQL以实现更高效的分析。