2012-06-10 49 views
-2

我的查询如下:这个计数是如何工作的?

select  vend_id, 
      COUNT(*) as num_prods 
from  Products 
group by vend_id; 

请告诉我如何做这部分工作 - select vend_id, COUNT(vend_id)而不是select COUNT(vend_id)

回答

0

当你根本没有GROUP BY条款选择COUNT(vend_id),你会得到一个行与非空厂商ID行的总数 - 最后一点是非常重要的,是一个原因,你可能更喜欢COUNT(*)以免“缺少”行。有些人可能会争辩说,COUNT(*)在某种程度上效率较低,但是在我没有使用的DBMS中是这样。在任何情况下,如果你使用脑死亡的DBMS,你可以尝试COUNT(1)

当你按vend_id,你会得到每个供应商ID一行与统计是行该ID的数量。

在一步一步的细节(概念,但几乎肯定要通过优化来获得效率),第一个查询:

SELECT COUNT(vend_id) AS num_prods FROM products 
  • 获取products所有行的列表。
  • 计数其中vend_id不是NULL的行,然后在单num_prods柱传送包含该计数一行。

对于分组之一:

SELECT vend_id, COUNT(vend_id) AS num_prods FROM products GROUP BY vend_id 
  • 获取products所有行的列表。
  • 对于vend_id每个值:
    • 计数匹配vend_idvend_id其中不为空,则传送包含在第一列中的vend_id并且在第二num_prods列计数一行的行。

注意以空vend_id那些行不参与聚合函数(count在这种情况下)。

在第一个查询,简单地意味着它们不会出现在总总。

在第二种情况下,它意味着输出行仍然存在,但是计数将是零。这是使用COUNT(*)COUNT(1)的另一个很好的理由。

2
select COUNT(vend_id) 

这将返回的行数,其中供应商ID不为空

select  vend_id, COUNT(*) as num_prods 
from  Products 
group by vend_id 

这将组通过标识的元素,并返回,每个ID,多少行你有。 一个例子:

ID   name  salary  start_date    city  region 
----------- ---------- ----------- ----------------------- ---------- ------ 
      1 Jason   40420 1994-02-01 00:00:00.000 New York W 
      2 Robert   14420 1995-01-02 00:00:00.000 Vancouver N 
      3 Celia   24020 1996-12-03 00:00:00.000 Toronto W 
      4 Linda   40620 1997-11-04 00:00:00.000 New York N 
      5 David   80026 1998-10-05 00:00:00.000 Vancouver W 
      6 James   70060 1999-09-06 00:00:00.000 Toronto N 
      7 Alison   90620 2000-08-07 00:00:00.000 New York W 
      8 Chris   26020 2001-07-08 00:00:00.000 Vancouver N 

如果您运行此查询,你会得到一个排的城市,你可以将一个函数(在这种情况下,计数)到该行。所以,对于每个城市,你会得到行数。您也可以使用其他功能。

SELECT  City, COUNT(*) as Employees 
FROM  Employee 
GROUP BY City 

结果是:

City  Employees 
--------- --------- 
New York   3 
Toronto   2 
Vancouver   3 

,你可以比较行数为每个城市

+2

“......将返回行数”_其中供应商ID不为空!_ – paxdiablo

+0

编辑!谢谢。 –

0

select vend_id只会选择vend_id场,其中select *会选择所有字段

+0

你能给正在发生什么的一步一步的解释? – superfast

+1

是的,但无处是'vend_id'或'*'选择,只能算作采取。 – paxdiablo

+0

(@paxdiablo,'vend_id'实际上是选择,但你的观点立场。) – huon

0

select vend_id, COUNT(vend_id)select COUNT(vend_id)只要给出了数列相同的结果,你使用group by vend_id。当您使用select vend_id, COUNT(vend_id)时,您必须使用vend_id

+0

他们可能会给你在数列中的数字相同,但他们最稳妥_don't_给出相同的结果,除非你的“结果”的想法是与我的显着不同:-)列数不同。 – paxdiablo

+0

@paxdiablo:是的你是对的。我的错。我编辑... Thanxz – Darshana