SQL中的计数(*)

SQL中的计数(*),sql,Sql,我了解在SQL中寻址一个表时如何计数(*),但它如何处理内部联接 e、 g staff包含staffNo staffName 属性包含属性管理详细信息(即哪些员工管理哪些属性) 这将返回由员工管理的属性数,但计数是如何工作的?就像它怎么知道要计算什么一样 它统计笛卡尔乘积中每个不同的StaffNo的行数 此外,您应该按分支、StaffNo进行分组。这是一个聚合函数,由group by子句管理。每一行将对应一个唯一的分组(即StaffNo),Count(*)将返回联接中与该分组匹配的记录数 例如:

我了解在SQL中寻址一个表时如何计数(*),但它如何处理内部联接

e、 g

staff包含staffNo staffName

属性包含属性管理详细信息(即哪些员工管理哪些属性)


这将返回由员工管理的属性数,但计数是如何工作的?就像它怎么知道要计算什么一样

它统计笛卡尔乘积中每个不同的
StaffNo
的行数


此外,您应该按分支、StaffNo进行分组。这是一个聚合函数,由group by子句管理。每一行将对应一个唯一的分组(即StaffNo),Count(*)将返回联接中与该分组匹配的记录数

例如:

 SELECT branch, grade, Count(*)
 FROM Staff s, Properties p 
 WHERE s.staffNo = p.staffNo
 GROUP BY branch, grade
将返回每个分支机构给定职等的工作人员人数

 SELECT branch, Count(*)
 FROM Staff s, Properties p 
 WHERE s.staffNo = p.staffNo
 GROUP BY branch
将返回每个分支机构的员工总数

 SELECT grade, Count(*)
 FROM Staff s, Properties p 
 WHERE s.staffNo = p.staffNo
 GROUP BY grade
将返回每个级别的员工总数

count(*)
只计算查询或
分组中的行数


在查询中,它将按staffNo打印行数。(有s.staffNo和p.staffNo是多余的;两者都足够)。

您的查询无效。

您的列名不明确
staffno

您正在选择分支
,但没有按它进行分组-为语法错误(除MySQL之外的所有内容)或为您选择的随机分支(MySQL)做好准备

不过,我想您想知道的是,它将返回按字段分组的每个“集合”的计数,因此对于
s.staffno,p.staffno的每个组合,该集合中有多少行。

聚合函数(无论是
count()
sum()
avg()
,等等)对每个组中的行计算:然后根据查询中定义的选择列表将该组折叠/汇总/聚合为一行

执行
select
查询的概念模型如下:

  • 计算FROM子句中所有表引用的笛卡尔积(就好像正在执行
    完全联接
  • 应用联接条件
  • 根据
    where
    子句中定义的条件进行筛选
  • 根据
    groupby
    条款中定义的标准分组
  • 将每个组减少为一行,计算该组中行上每个聚合函数的值
  • 根据having子句中定义的标准进行筛选
  • 根据
    order by
    子句中定义的标准进行排序
  • 这个概念模型省略了处理任何
    compute
    compute…by
    子句


    这不是一个非常幼稚的SQL引擎实际执行查询的方式,但结果应该与这样做[最终]得到的结果完全相同。

    详细信息:这不是外部连接,而是(隐式)内部连接。好吧,让我大吃一惊-我在没有完成回答的情况下点击了提交:)我终于到了那里!那么它实际上是在计算p.Staff=s.Staff的数量吗?否-运行以下查询:从Staff s中选择branch,s.staffNo,Properties p,其中s.staffNo=p.staffNo。这将显示未聚合的结果集。您可能有多行具有相同的staffNo。这是因为在其中一个表中有多行具有此staffNo。添加COunt()和上面的Group子句将把resultset减少到按staffNo分组的行中。如果以前存在多个条目,现在这将反映在Count()结果中。
     SELECT grade, Count(*)
     FROM Staff s, Properties p 
     WHERE s.staffNo = p.staffNo
     GROUP BY grade