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;