2011-05-26 54 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引擎將實際執行查詢,但結果應該是相同的東西你[最終]得到,如果你做到了這條路。