我的查询如下:
select vend_id,
COUNT(*) as num_prods
from Products
group by vend_id;
请告诉我这部分是如何工作的——select vend_id, COUNT(vend_id)
而不是select COUNT(vend_id)
?
我的查询如下:
select vend_id,
COUNT(*) as num_prods
from Products
group by vend_id;
请告诉我这部分是如何工作的——select vend_id, COUNT(vend_id)
而不是select COUNT(vend_id)
?
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
如果你运行这个查询,你会得到一个城市的行,你可以应用一个函数(在本例中为计数)到该行。因此,对于每个城市,您将获得行数。您还可以使用其他功能。
SELECT City, COUNT(*) as Employees
FROM Employee
GROUP BY City
结果是:
City Employees
--------- ---------
New York 3
Toronto 2
Vancouver 3
因为您可以比较每个城市的行数
select vend_id, COUNT(vend_id)
只要select COUNT(vend_id)
您使用group by vend_id
. 当你使用时,select vend_id, COUNT(vend_id)
你必须使用它来分组vend_id
当您简单地选择COUNT(vend_id)
不带GROUP BY
子句时,您会得到一行,其中包含具有非 NULL 供应商 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_id
计算与where不为 NULL的行匹配的行数vend_id
,然后传递包含vend_id
第一列中的行和第二num_prods
列中的计数的行。请注意,那些带有 null 的行vend_id
对聚合函数没有贡献(count
在这种情况下)。
在第一个查询中,这仅仅意味着它们没有出现在总体总数中。
在第二种情况下,这意味着输出行仍然存在,但计数为零。COUNT(*)
这是使用or的另一个好理由COUNT(1)
。
select vend_id
只会选择vend_id
字段,whereselect *
会选择所有字段