Sql 使用group by时计数(属性)和计数(*)之间的差异
我还不明白Sql 使用group by时计数(属性)和计数(*)之间的差异,sql,Sql,我还不明白count(*)和使用属性作为参数的count之间的区别。 这里我举一个例子:有两种关系: project (id, name, number); employee (ssn, name, surname); working_on (employee_ssn, project_id); 使用employee\u ssn引用employee(ssn)和project\u id引用project(id) 主键:项目(id),员工(ssn),工作(员工ssn,项目id)。 现在,我必须
count(*)
和使用属性作为参数的count之间的区别。这里我举一个例子:有两种关系:
project (id, name, number);
employee (ssn, name, surname);
working_on (employee_ssn, project_id);
使用employee\u ssn
引用employee(ssn)
和project\u id
引用project(id)
主键:
项目(id)
,员工(ssn)
,工作(员工ssn
,项目id
)。现在,我必须找到每个项目的id、名称以及参与该项目的员工人数。
正确的解决方案(见本书)如下:
select id, name, count (*)
from working_on join project on id=project_id
group by name, id
我不明白为什么这个解决方案是有效的,难道不应该count(*)
count所有元组吗?为什么通过这种方式,it部门可以获得从事it工作的确切员工人数?我编写了以下解决方案:
select id, name, count (employee_ssn)
from working_on join project on id=project_id
group by name, id
解决方案是否等效?一般来说,使用
count(*)
和count(属性)
?您能否提供一个示例,说明这两种语法产生不同的结果?count(*)
将计数为NULL,而count(attribute)
将不计数。因此,当列中的值为空时,唯一的区别将出现在:
计数(expr)
返回行中expr的非空值的计数
由SELECT
语句检索
COUNT(*)有些不同,因为它返回 检索的行数,无论它们是否包含
NULL
值
换言之:
COUNT(expr)
将返回expr中没有NULL值的行数
COUNT(*)
将返回返回的行总数
您是否使用了GROUP BY
子句无关紧要。到目前为止,我发现了两个区别-
如上所述,count(col)不计算空值,而count(*)计算空值
它在联接查询中的行为不同
考虑这样一种情况,我需要加入employee和department表,并需要查找每个部门的员工数
2.a
在上面的查询中,它不会返回employee table count=0的记录
2.b
如果您使用count(例如DEPARTMENT_ID)而不是count(*),那么这次即使员工表count=0,它也会给出记录
2.c
这是一个有趣的部分,当您使用COUNT(DPT.ID)时,因为DPT.ID是部门的列,这里再次记录了员工表COUNT=0的位置。正如其他人所说,COUNT(*)
将计算检索到的行总数,但是,COUNT(属性名称)
将只计算非空值的数量。
实际上,它们都计算非空值的数量,但是,因为在关系数据库中不应该有行-元组-其所有值都为空(它应该有一个不能为空的主键),COUNT(*)
将始终返回表-关系中的总行数-构成,主键列-属性的值数-
SELECT DPT.ID
, COUNT(*) EMP_COUNT
FROM DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON DPT.ID = E.DEPARTMENT_ID
GROUP BY DPT.ID;
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;
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;