-2

我的查询如下:

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

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

4

4 回答 4

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

如果你运行这个查询,你会得到一个城市的行,你可以应用一个函数(在本例中为计数)到该行。因此,对于每个城市,您将获得行数。您还可以使用其他功能。

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

结果是:

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

因为您可以比较每个城市的行数

于 2012-06-10T04:09:33.990 回答
0

select vend_id, COUNT(vend_id)只要select COUNT(vend_id)您使用group by vend_id. 当你使用时,select vend_id, COUNT(vend_id)你必须使用它来分组vend_id

于 2012-06-10T05:06:53.393 回答
0

当您简单地选择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)

于 2012-06-10T04:09:20.773 回答
0

select vend_id只会选择vend_id字段,whereselect *会选择所有字段

于 2012-06-10T04:10:13.370 回答