SQL关联子查询
时间:2018-11-15 17:46:05 来源:igfitidea点击:
在本教程中,我们将学习SQL关联子查询,它是一个依赖于外部查询的子查询。
SQL关联子查询介绍
关联子查询(相关子查询)是依赖于外部查询的子查询。这意味着相关子查询的WHERE子句使用了外部查询的数据。
相关子查询和非相关子查询之间的主要区别在于,不能像执行非相关子查询那样单独执行相关子查询。此外,对于来自外部查询的每个选定行,都执行一次相关子查询。
关联子查询也称为重复子查询或同步子查询。
SQL关联子查询示例
让我们看一些示例来理解相关子查询的概念。
SELECT子句中的SQL相关子查询示例
下面的查询销售额在前5位的客户:
SELECT
companyname,
city,
(SELECT
SUM(unitprice * quantity)
FROM
orders_test
INNER JOIN
orderdetails ON orderdetails.orderid = orders_test.orderid
WHERE
orders_test.customerid = customers.customerid) AS total
FROM
customers
ORDER BY total DESC
LIMIT 5;

相关子查询计算每个从客户表中选择的客户的总销售额。从外部查询中选择的customerid被传递到相关子查询,以获取相应的销售数据。
WHERE子句中的SQL关联子查询示例
也可以在WHERE子句中使用关联子查询。
例如,以下示例使用WHERE子句中的相关子查询来查找总销售额超过10万的客户:
SELECT
companyname, city
FROM
customers
WHERE
100000 < (
SELECT
SUM(unitprice * quantity)
FROM
orders_test
INNER JOIN
orderdetails ON orderdetails.orderid = orders_test.orderid
WHERE
orders_test.customerid = customers.customerid);
对于每个客户,相关子查询计算总销售额。WHERE子句则检查相关子查询返回的销售总额是否大于10万。
HAVING子句中的SQL关联子查询
可以在外部查询的HAVING子句中使用关联子查询。请参见以下示例:
SELECT
t1.categoryID, categoryName
FROM
products t1
INNER JOIN
categories c ON c.categoryID = t1.categoryID
GROUP BY categoryID
HAVING MAX(unitprice) > ALL (
SELECT 2 * AVG(unitprice)
FROM
products t2
WHERE
t1.categoryID = t2.categoryID)

在上述查询中:
- 子查询计算每个类别的平均单价,并将其乘以2。
- 外部查询选择单价大于关联子查询返回的2倍平均单价的产品类别。

