





















以下为 SQL 中高级子查询的用法解析,涵盖 ANY、EXISTS 及子查询的多位置应用。
学习内容
示例代码与讲解
1. ANY 关键字
SELECT *
FROM clients
WHERE client_id IN (
SELECT client_id
FROM invoices
GROUP BY client_id
HAVING COUNT(*) > 2
);
SELECT *
FROM clients
WHERE client_id = ANY (
SELECT client_id
FROM invoices
GROUP BY client_id
HAVING COUNT(*) > 2
);
2. 相关子查询
USE sql_hr;
SELECT *
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.office_id = e.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;
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;
作业
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;
总结
本次解析了 ANY(等效 IN)、相关子查询、EXISTS 及子查询在 SELECT 和 FROM 中的应用。基于 sql_invoicing、sql_hr 和 sql_store 数据库。后续将探讨视图与事务。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。