3

我不明白将count(*)属性作为参数与计数之间的区别。
这里我举个例子:有两种关系:

project (id, name, number);
employee (ssn, name, surname);
working_on (employee_ssn,   project_id);

employee_ssn哪些引用employee(ssn)project_id引用project(id)
主键:project(id), employee(ssn), working_on ( employee_ssn, project_id)。
现在我必须为每个项目查找项目的 ID、名称和从事该项目的员工人数。
一个正确的解决方案(在书中找到)是这个:

select id, name, count (*)
from working_on join project on id=project_id
group by name, id

我有,不明白为什么这个解决方案是有效的,不应该count (*)计算所有的元组?为什么以这种方式获得工作的确切员工数量?
我已经写了这个解决方案:

select id, name, count (employee_ssn)
from working_on join project on id=project_id
group by name, id

解决方案是否等效?一般来说,使用and
有区别吗?您能否提供一个示例,说明这两种语法会产生不同的结果?count (*)count(attribute)

4

4 回答 4

4

文档中:

计数(expr)

返回语句检索的行中非 exprNULL值的计数。SELECT


COUNT(*)有点不同,它返回检索到的行数的计数,无论它们是否包含NULL值。

换句话说:

COUNT(expr)将返回没有exprNULL值的行数。

COUNT(*)将返回返回的总行数。

您是否使用GROUP BY子句无关紧要。

于 2012-06-02T16:20:53.987 回答
3

count(*)将计算一个 NULL 并且count(attribute)不会。因此,当列中有 NULL 值时,将出现唯一的区别

于 2012-06-02T16:16:42.523 回答
1

到目前为止,我发现了两个不同之处-

  1. 正如上面提到的 eric,count(col) 不计算空值,而 count (*) 计算。

  2. 它在连接查询中的行为不同。

考虑一个我需要加入员工和部门表的情况,我需要找到每个部门的员工数量。

2.a.

SELECT     DPT.ID 
,          COUNT(*) EMP_COUNT
FROM       DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON         DPT.ID = E.DEPARTMENT_ID
GROUP BY   DPT.ID;

在上面的查询中,它不会返回那些雇员表 count=0 的记录。

2.b。

SELECT     DPT.ID 
,          COUNT(E.DEPARTMENT_ID) EMP_COUNT
FROM       DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON         DPT.ID = E.DEPARTMENT_ID
GROUP BY   DPT.ID;

如果使用 count(E.DEPARTMENT_ID) 而不是 count(*),这一次即使员工表 count=0 也会给出记录。

2.c。

SELECT     DPT.ID 
,          COUNT(DPT.ID) EMP_COUNT
FROM       DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON         DPT.ID = E.DEPARTMENT_ID
GROUP BY   DPT.ID;

这是有趣的部分,当您使用 COUNT(DPT.ID) 时,由于 DPT.ID 是部门的列,这里再次记录员工表 count=0 的情况将不被考虑。

于 2012-06-02T16:27:11.960 回答
0

正如其他人所说,COUNT(*)将计算检索到的总行数,但是,COUNT(attribute_name)只会计算非空值的数量。实际上,它们都计算非空值的数量,但是,因为在关系数据库中不应该有行 - 元组 - 其所有值都为 NULL(它应该有一个不能为 NULL 的主键),所以COUNT(*)总是返回表的总行数-relation-构成,主键列的值个数-attribute-

于 2020-12-19T14:27:20.937 回答