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
答案 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列。