SQL中子查询的执行顺序

时间:2018-08-21 11:23:22

标签: sql

SELECT customerid, 
(SELECT COUNT(*)
FROM orders
WHERE customers.customerid = orders.customerid) as total_orders
FROM customers

任何人都可以解释此SQL代码的工作方式吗?根据我的说法,在这种情况下,子查询应始终返回相同数量的行,因为总数没有。的行数 customers.customerid = orders.customerid是相同的。但是它显示了每个客户以及他/她做出的total_orders。导致执行的顺序是什么?

请在此处找到数据库:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_distinct

2 个答案:

答案 0 :(得分:3)

您的查询是:

SELECT c.customerid, 
       (SELECT COUNT(*)
        FROM orders o
        WHERE c.customerid = o.customerid
       ) as total_orders
FROM customers c;

(请注意,我添加了表别名并限定了所有列名。)

这是一个标量,相关子查询。这是一个标量子查询,因为它返回一个值(而不是一个表)。

它是相关的,因为子查询链接到外部查询。这是令您困惑的部分。

基本上,外部查询表明结果集将为每个客户提供一行。

子查询然后说,对于每个客户,结果集将计算任何给定行中该客户的匹配行数。

尽管用子查询编写查询是完全可以的,但这通常写为:

SELECT c.customerid, COUNT(o.customerid) as total_orders
FROM customers c LEFT JOIN
     orders o
     ON c.customerid = o.customerid
GROUP BY c.customerId

答案 1 :(得分:0)

基本上,您使用的是 Correlated 子查询,这意味着将对外部查询的每一行执行内部查询。

在您的情况下,由于where子句customers.customerid = orders.customerid,将对所有客户执行内部查询。因此,聚合函数COUNT(*)返回每个客户的订单总数。由于您的外部查询选择了customerId和total_orders,因此您获得了2列。