SQL关联子查询


在本教程中,我们将学习SQL关联子查询,它是一个依赖于外部查询的子查询。

SQL关联子查询介绍

关联子查询(相关子查询)是依赖于外部查询的子查询。这意味着相关子查询的WHERE子句使用了外部查询的数据。

相关子查询和非相关子查询之间的主要区别在于,不能像执行非相关子查询那样单独执行相关子查询。此外,对于来自外部查询的每个选定行,都执行一次相关子查询。

关联子查询也称为重复子查询或同步子查询。

SQL关联子查询示例

让我们看一些示例来理解相关子查询的概念。

SELECT子句中的SQL相关子查询示例

下面的查询销售额在前5位的客户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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万的客户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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子句中使用关联子查询。请参见以下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
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倍平均单价的产品类别。


原文链接:https://codingdict.com/