不明白 COUNT 和 GROUP BY 的概念?

ach*_*san 3 mysql count group-by

这不是我的工作,也不是我的家庭作业。我刚刚从 Donatus 教授的 udemy 课程中自学,这些是他在课程中使用的问题。

目标 1: 您的物流经理想要了解每个运输区域在公司数据库中出现的次数。使用 SQL 查询来获取详细信息。

目标 2: 使用 Shipregion 列,计算每个值在该列中出现的次数。

数据库:北风

表:订单

在此输入图像描述

解决方案1:

SELECT ShipRegion,
    COUNT(ShipRegion)
FROM
    orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

解决方案2:

SELECT ShipRegion,
    COUNT(*)
FROM
    orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

我理解第一个解决方案,但不理解第二个解决方案。

我的困惑: COUNT(*) 如何确保只计算所有船舶区域?是因为使用了group by shipregion吗?

如果是这种情况,在上面的解决方案中,我们还使用g COUNT(shipregion)。我不明白。请帮忙。

Erg*_*sha 5

COUNT() 函数是一个聚合函数,它返回表中的行数。COUNT() 函数允许您计算所有行或仅计算符合指定条件的行。

COUNT() 函数具有三种形式:

  1. COUNT(*),
  2. COUNT(expression)
  3. COUNT(DISTINCT expression)

COUNT(*)功能

COUNT(*)函数返回 SELECT 语句返回的结果集中的行数。返回COUNT(*)行数,包括重复行、非 NULL 行和 NULL 行。

COUNT(expression)

返回COUNT(expression)不包含 NULL 值作为表达式结果的行数。

COUNT(DISTINCT expression)

COUNT(DISTINCT 表达式) 返回不包含 NULL 值的不同行数作为表达式的结果。

COUNT()函数的返回类型是BIGINT。COUNT() 如果没有找到匹配的行,该函数返回 0。

根据您的数据考虑一个简化的示例

CREATE TABLE   `orders` (
  `ShipRegion` varchar(6) 
) ;

INSERT INTO `orders` VALUES (null),(null),('RJ'),('RJ'),('RJ'),('SP'),('NM'),('NM');
Run Code Online (Sandbox Code Playgroud)

查询1,

SELECT ShipRegion,
      COUNT(*)
FROM orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

结果

ShipRegion  COUNT(*)
   null       2
   RJ         3
   SP         1
   NM         2
Run Code Online (Sandbox Code Playgroud)

查询2,

SELECT ShipRegion,
       COUNT( ShipRegion)
FROM  orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

结果

ShipRegion  COUNT( ShipRegion)
    null         0
    RJ           3
    SP           1
    NM           2
Run Code Online (Sandbox Code Playgroud)

查询3,

SELECT ShipRegion,
       COUNT(distinct ShipRegion)
FROM  orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

结果

ShipRegion  COUNT(distinct ShipRegion)
    null        0
    NM          1
    RJ          1
    SP          1
Run Code Online (Sandbox Code Playgroud)

我的困惑:如何确保COUNT(*)只计算所有船舶区域?是因为使用了group by shipregion吗?

是的,该COUNT(*)函数经常与子句一起使用GROUP BY,以返回每个组中的元素数量。

在第一个目标中,我认为您需要应用 Shipregion 不为空的位置,因为 null 不等于任何内容

SELECT ShipRegion,
      COUNT(*)
FROM orders
WHERE ShipRegion is not null
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

在这里查看演示

阅读有关计算行数的更多信息