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