2011-05-26 55 views
5

我知道如何在SQL中计数(*)时处理一个表,但它如何处理内部连接?SQL中的COUNT(*)

例如

SELECT branch, staffNo, Count(*) 
FROM Staff s, Properties p 
WHERE s.staffNo = p.staffNo 
GROUP BY s.staffNo, p.staffNo 

人员包含staffNo staffName

属性包含物业管理的细节(即其员工管理其财产)

这个方法返回的工作人员管理的物业数量,但如何算工作?至于它如何知道要算什么?

+0

细节:它不是外连接。这是一个(隐式)**内部**连接。 – 2011-05-26 12:39:08

回答

7

它是一个聚合函数 - 因此它由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 

返回的工作人员总数将在每个年级

+1

好好打击我 - 我打了提交没有完成我的回答 – BonyT 2011-05-26 12:43:45

+0

+1 - 尼斯编辑! – JNK 2011-05-26 12:44:13

+0

@BonyT - 不用担心,我删除了DV,并添加了紫外线编辑 – JNK 2011-05-26 12:44:30

0

它计算笛卡尔乘积中每个不同StaffNo的行数。您也可以按Branch, StaffNo分组。

1

count (*)返回员工总数只计算行数的查询或group by

在您的查询中,它将打印staffNo的行数。 (拥有s.staffNo,p.staffNo是多余的;或者足够)。

3

您的查询无效。

您有一个不明确的列名staffno

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

我想你想知道的是,它会返回你的分组字段中每个“集合”的计数,所以对于s.staffno, p.staffno的每个组合,该集合中有多少行。

+1

@马丁 - 糟糕!更正了,谢谢! – JNK 2011-05-26 12:43:31

2

聚集函数(无论是count()sum()avg()等)被计算每个组中的行:该组,然后折叠/概括/根据在定义的选择列表聚集到单个行查询。

select查询执行的概念模型是这样的:

  1. 计算FROM子句中的所有表的引用的笛卡尔积(就好象一个full join正在执行
  2. 应用加入标准。
  3. 滤波器根据where节中规定的标准。
  4. Partitition成组,基于所述group by节中规定的标准。
  5. 将每个组缩减为一行,计算该组中行上每个聚合函数的值。
  6. 根据根据order by子句

此概念模型忽略了声明处理任何computecompute...by条款中所定义的标准的having clause

  • 排序定义的标准滤波器。

    不是这这实际上不是怎么什么,但一个非常幼稚的SQL引擎将实际执行查询,但结果应该是相同的东西你[最终]得到,如果你做到了这条路。