我有这个查询,它查找每个工作人员处理的属性数量及其分支编号:
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(*)
指的是什么?为什么它会计算属性的数量而不是(例如)每个分支的人员数量?
答案 0 :(得分:2)
评论时间有点长。
COUNT(*)
正在计算每个组中的行数。它没有具体计算任何特定的列。相反,正在发生的事情是join
正在生成多个属性,因为这些属性会导致给定值为s.branchNo
和s.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(*)
返回指定表中的行数而不删除重复项。这意味着您无法将Distinct
与count(*)
Count(*)
将返回指定映射的基数(表中的元素)。
您必须记住的是,在特定列上使用count
时,null
不会被允许,而count(*)
将允许行中的null,因为它可能是任何领域。
SQL如何知道COUNT(*)指的是什么?
我很确定,但不是100%肯定,因为我无法在文档中找到,sql optimizer
只是简单地对primary key
(非空)进行计数试图在行中处理null
。