惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
The Cloudflare Blog
S
SegmentFault 最新的问题
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
量子位
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
V2EX
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
J
Java Code Geeks
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI

博客园 - lzhdim

25个每个开发人员都应该掌握的JavaScript 数组方法 20260831 - 个人小作品更新 C#使用SQLite数据库例子 - 开源研究系列文章 20260830 - 个人小作品更新 20260829 - 个人小作品更新 13、JavaScript事件循环机制 - JavaScript学习系列文章 首款媲美分体水冷的一体水冷!微星CORELIQUID E15 360水冷散热器评测:目前为止 锐龙9 9950X3D最强性能释放 JavaScript常见的内存泄露问题 - JavaScript学习系列文章 C#开发的颜色取色器 - 开源研究系列文章 - 个人小作品 成长环境 - 我的闪存 提高 SQL 语句执行速度的方法 JavaScript安全最佳实践 关闭iPhone一些默认设置,让iPhone更流畅 20260814 - 个人小作品更新 JavaScript对象与元编程 20260812 - 个人小作品更新 JavaScript 模块化系统 Markdown 语法完全指南 C# 通过 Windows API 实现进程内存读写操作 JavaScript 函数进阶课题 C#开发的基于钩子技术监测键鼠事件的例子 - 开源项目研究文章 JavaScript异步编程的演进 近十年最帅风冷!酷冷至尊V8 ACE 3DHP散热器评测:单塔能干翻双塔 20260723 - 个人小作品更新 C# 中读取CPU、硬盘和内存温度 雷柏VT3s MAX鼠标评测:中小手型用户也没有被遗忘 顶尖性能的小号电竞鼠标来了 JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册
SQL 入门 9:SQL 高级子查询:ANY、EXISTS 与多位置应用
lzhdim · 2026-04-06 · via 博客园 - lzhdim

以下为 SQL 中高级子查询的用法解析,涵盖 ANY、EXISTS 及子查询的多位置应用。

学习内容

  1. ANY 关键字
    • 与子查询结果集的任一值比较,等效于 IN(用于相等时)。
    • 返回多值时使用。
  2. 相关子查询
    • 子查询依赖外部查询的列,逐行执行。
    • 示例:比较员工薪资与其部门平均值。
  3. EXISTS
    • EXISTS:逐行检查,子查询结果集大时性能较优。
    • IN:先执行子查询,外部表大时更快。
    • 连接:需根据需求选择(如 LEFT JOIN 加 IS NULL)。
    • 判断子查询是否有记录返回,适用于相关子查询。
    • 与 IN 和连接对比:
  4. SELECT 中的子查询
    • 在列中嵌入子查询,计算动态值。
    • 限制:同一级别查询不能直接引用新列名,需通过外层查询或后续语句(如 ORDER BY、HAVING)使用。
  5. FROM 中的子查询
    • 将子查询结果作为虚拟表,需指定别名。
    • 可用于复杂数据处理,类似临时表。

示例代码与讲解

1. ANY 关键字

SELECT *
FROM clients
WHERE client_id IN (
    SELECT client_id
    FROM invoices
    GROUP BY client_id
    HAVING COUNT(*) > 2
);

  • 找出发票数 > 2 的客户。

SELECT *
FROM clients
WHERE client_id = ANY (
    SELECT client_id
    FROM invoices
    GROUP BY client_id
    HAVING COUNT(*) > 2
);

  • 用 ANY 替代 IN,效果相同,表示匹配子查询任一值。

2. 相关子查询

USE sql_hr;
SELECT *
FROM employees e
WHERE salary > (
    SELECT AVG(salary)
    FROM employees e2
    WHERE e2.office_id = e.office_id
);

  • 找出薪资高于所在办公室平均值的员工,子查询与外部 office_id 相关。

3. EXISTS

USE sql_invoicing;
SELECT client_id, name
FROM clients c
WHERE EXISTS (
    SELECT client_id
    FROM invoices ci
    WHERE c.client_id = ci.client_id
);

  • 找出有发票的客户,逐行检查是否存在匹配记录。

4. SELECT 中的子查询

SELECT invoice_id, invoice_total,
    (SELECT AVG(invoice_total) FROM invoices) AS avginvoice_total,
    (SELECT avginvoice_total) - invoice_total AS difference
FROM invoices;

  • 计算每张发票与平均值的差额。
  • 注意:avginvoice_total 不能直接在同级使用,需通过外层查询引用。

5. FROM 中的子查询

SELECT *
FROM (
    SELECT c.client_id, name,
        (SELECT SUM(i.invoice_total) FROM invoices i WHERE c.client_id = i.client_id) AS total_sales,
        (SELECT AVG(invoice_total) FROM invoices) AS AVERAGE,
        (SELECT total_sales - AVERAGE) AS difference
    FROM clients c
) AS SUMMARY
WHERE total_sales IS NOT NULL;

  • 将子查询结果作为虚拟表 SUMMARY,筛选非空销售总额。

作业

1. 相关子查询

USE sql_invoicing;
SELECT *
FROM invoices i
WHERE invoice_total > (
    SELECT AVG(invoice_total)
    FROM invoices i2
    WHERE i.client_id = i2.client_id
);

  • 找出总额高于其客户平均值的发票。

2. EXISTS

USE sql_store;
SELECT *
FROM products p
WHERE NOT EXISTS (
    SELECT *
    FROM order_items
    WHERE p.product_id = order_items.product_id
);

  • 找出从未被订购的产品。

3. SELECT 中的子查询

USE sql_invoicing;
 CLEARSELECT c.client_id, name,
    (SELECT SUM(i.invoice_total) FROM invoices i WHERE c.client_id = i.client_id) AS total_sales,
    (SELECT AVG(invoice_total) FROM invoices) AS AVERAGE,
    (SELECT total_sales - AVERAGE) AS difference
FROM clients c;

  • 计算每个客户的销售总额、平均值及差额,避免 GROUP BY。

总结

本次解析了 ANY(等效 IN)、相关子查询、EXISTS 及子查询在 SELECT 和 FROM 中的应用。基于 sql_invoicing、sql_hr 和 sql_store 数据库。后续将探讨视图与事务。