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倍平均单价的产品类别。