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