我的查询如下:
select vend_id,
COUNT(*) as num_prods
from Products
group by vend_id;
请告诉我这部分如何运作 - select vend_id, COUNT(vend_id)
而不是select COUNT(vend_id)
?
答案 0 :(得分:2)
select COUNT(vend_id)
这将返回供应商ID不为空的行数
select vend_id, COUNT(*) as num_prods
from Products
group by vend_id
这将按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
如果您运行此查询,您将获得城市的一行,并且您可以将一个函数(在本例中为count)应用于该行。因此,对于每个城市,您将获得行数。您还可以使用其他功能。
SELECT City, COUNT(*) as Employees
FROM Employee
GROUP BY City
结果是:
City Employees
--------- ---------
New York 3
Toronto 2
Vancouver 3
因为您可以比较每个城市的行数
答案 1 :(得分:0)
当您只选择COUNT(vend_id)
没有GROUP BY
子句时,您将得到一行,其中包含非NULL供应商ID的行总数 - 最后一位很重要,这也是您的一个原因可能更喜欢COUNT(*)
,以避免“丢失”行。有些人可能会说COUNT(*)
在某种程度上效率较低,但在我使用过的DBMS中都是如此。在任何情况下,如果 使用脑死亡的DBMS,您可以随时尝试COUNT(1)
。
当您按vend_id
分组时,每个供应商ID会获得一行,其中count是该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_id
不匹配的vend_id
匹配的行,然后在第一列中提供包含vend_id
的一行,并在第二列num_prods
列中提供该计数请注意,那些空vend_id
的行对聚合函数没有贡献(在这种情况下为count
)。
在第一个查询中,这仅仅意味着它们不会出现在总计中。
在第二种情况下,这意味着输出行仍然存在,但计数将为零。这是使用COUNT(*)
或COUNT(1)
的另一个好理由。
答案 2 :(得分:0)
select vend_id
只会选择vend_id
字段,其中select *
会选择所有字段
答案 3 :(得分:0)
select vend_id, COUNT(vend_id)
, select COUNT(vend_id)
和group by vend_id
就会为count列提供相同的结果。当您使用select vend_id, COUNT(vend_id)
时,您必须使用vend_id