有人能解释一下这个 SQL 查询中的 Count 是如何工作的吗?

3

我正在SSRS中制作一个表格,第一列包含客户名称,第二列包含对应的订单数量。这个查询可以实现我想要的功能,但是我不知道Count函数如何知道我想要计数和我想要从哪个表中计数。有人可以解释一下,以便我将来更好地理解吗?非常感谢。

SELECT Customers.name
    ,Count(1) AS OrderCount
FROM Customers
INNER JOIN Orders
    ON Customers.id = Orders.customer_id
GROUP BY Customers.name

这真的应该打上 mysql 标签吗?如果你使用报告服务,你更可能想要 sql-server。 - Joel Coehoorn
1
这个查询针对每个唯一的客户名称计算每条记录(1可以是任何其他常量)。可能难以理解的是如何定义“记录”。请记住,SQL首先计算集合(表彼此连接),然后投影结果,以便在选择子句中使用。count不例外,它从此结果集中计算records,即使涉及5个表。 - Sebas
3个回答

6
我不确定Count函数如何知道我想要计算什么。
只有一件事情可以被Count计算 - 它可以计算表达式评估为非null值的行数。如果您在常规查询中使用COUNT(1),则会在每行上得到1。然而,在GROUP BY中,COUNT将返回特定组中的行数。在您的情况下,这将是具有相同Customers.name的行数,因为您在GROUP BY中使用它。
至于传递1给COUNT,如今更常见的做法是传递星号,即编写COUNT(*),因为在大多数RDBMS引擎中,这没有性能惩罚。

1
它还可以计算非空列值,其数量可能与行数不同。 - Martin Smith
你能描述一下传递 1* 之间的区别吗?它们实际上是做什么的? - Fulluphigh

2

每找到一条记录,Count 都会对 true 计数。因此,如果有 3 条记录,它会计算 true 3 次,并返回 3。它实际上并不关心在其中计算什么,只要它存在或者是一个常量就可以被计算。如果它存在,它就会被计数。重点在于当你按照某个字段进行分组时所分组的行数。


-3

它计算结果集中第一个字段出现的次数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接