5.3 — 子查询基础
你将学习
- 什么是子查询及其作用
- 如何使用子查询进行动态筛选
- 子查询的Excel类比
什么是子查询?
子查询是嵌套在另一个查询中的查询。它允许您将一个查询的结果作为另一个查询的输入——类似于在Excel中使用辅助表或公式。
示例数据表
sales表:
Product | Amount | SaleDate |
---|---|---|
Apples | 120 | 2024-05-01 |
Oranges | 80 | 2024-05-01 |
Bananas | 50 | 2024-05-02 |
Pears | 60 | 2024-05-02 |
Grapes | 90 | 2024-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
);
关键要点
- 子查询使您的筛选更加动态和强大
- 它们可以在
WHERE
、IN
、EXISTS
甚至SELECT
子句中使用
下一步
接下来,您将学习如何将Excel工作流迁移到SQL以实现更高效的分析。