GROUP BY如何使用COUNT(*)

时间:2015-02-04 15:45:13

标签: sql

我有这个查询,它查找每个工作人员处理的属性数量及其分支编号:

SELECT s.branchNo, s.staffNo, COUNT(*) AS myCount
FROM Staff s, PropertyForRent p
WHERE s.staffNo=p.staffNo
GROUP BY s.branchNo, s.staffNo

这两个关系是:

Staff{staffNo, fName, lName, position, sex, DOB, salary, branchNO}
PropertyToRent{propertyNo, street, city, postcode, type, rooms, rent, ownerNo, staffNo, branchNo}

SQL如何知道COUNT(*)指的是什么?为什么它会计算属性的数量而不是(例如)每个分支的人员数量?

3 个答案:

答案 0 :(得分:2)

评论时间有点长。

COUNT(*)正在计算每个组中的行数。它没有具体计算任何特定的列。相反,正在发生的事情是join正在生成多个属性,因为这些属性会导致给定值为s.branchNos.staffNo的多行。

如果包含列名,它会变得更加“混乱”。以下都会返回相同的值:

COUNT(*)
COUNT(s.branchNo)
COUNT(s.staffNo)
COUNT(p.propertyNo)

使用列名称,COUNT()确定列中没有NULL值的行数。

最后,您应该学会在查询中使用正确的join语法。将join条件放在on子句中,而不是where子句中:

SELECT s.branchNo, s.staffNo, COUNT(*) AS myCount
FROM Staff s JOIN
     PropertyForRent p
     ON s.staffNo = p.staffNO
GROUP BY s.branchNo, s.staffNo;

答案 1 :(得分:0)

GROUP BY子句对结果集进行分区。这些分区都是sql引擎需要知道的 - 它只是计算它们的大小。

count(*)部分中仅使用select来尝试查询。

特别是,COUNT(*) 会在结果集中产生不同行/列的数量!

答案 2 :(得分:0)

有些人可能认为count(*)确实计算了所有列,但sql optimizer比这更聪明。

COUNT(*)返回指定表中的行数而不删除重复项。这意味着您无法将Distinctcount(*)

一起使用

Count(*)将返回指定映射的基数(表中的元素)。

您必须记住的是,在特定列上使用count时,null不会被允许,而count(*)将允许行中的null,因为它可能是任何领域。

  

SQL如何知道COUNT(*)指的是什么?

我很确定,但不是100%肯定,因为我无法在文档中找到,sql optimizer只是简单地对primary key(非空)进行计数试图在行中处理null