为什么count(*)将我的搜索限制为1行

时间:2016-02-21 09:40:06

标签: mysql

使用员工数据库(https://github.com/datacharmer/test_db)我有(作为示例)以下语句:

select first_name, count(*) from employees;

现在这将提供以下输出:

first_name  |  count(*)   
Georgie     |  300024   

虽然这句话:

select first_name, (select count(*) from employees) from employees;

会给出以下输出:

first_name  |  select count(*) ...   
Georgi      |  300024
Bezalel     |  300024
Parto       |  300024 
etc...      |  300024

澄清我的问题:我不明白为什么第一个语句将我的搜索查询限制为1行(只有Georgi显示),而最后一个语句(带子查询)显示所有名称,因此不限制我的将查询搜索到第一行的第1行。

3 个答案:

答案 0 :(得分:3)

您的第一个查询:

Count()是一个聚合函数,它计算数据集(或组)中的所有行。这就是为什么你只得到一行,因为你在这里只有一个。

您的第二个查询:

你正在做同样的事情(参考第一个查询),但现在你在subquery中进行了这样的操作,因此它会针对每一行运行,并再次Count(*)所以它返回相同的价值。

<强>解决方案:

您需要使用Group Byfirst_name在数据中创建论坛。然后Count每组中的行:

Select first_name, count(first_name) 
From employee
Group by first_name

它会为您计算数据集中的所有first_name

答案 1 :(得分:2)

COUNTGROUP BY子句结合使用的方式在第一次遇到它时会有点混乱。我将尝试解释它在您提供的每个示例中的行为。

  

从员工中选择first_name,count(*);

COUNTaggregate function。此类函数将对SELECT语句返回的每个行(称为)执行计算。您可以使用GROUP BY子句创建多个组,但由于您不在此查询中使用它,因此整个数据集将充当一个组。因此,COUNT函数将计算表中的整个行数。

一种方法是最终结果中的行数等于组数。

  

通过first_name从雇员组中选择first_name,count(*);

假设您的表总共包含6行,其中三行的first_name字段等于 Foo ,其他三行的 Bar 。最终会有两个组,COUNT函数将计算每个组中的行数。因此,结果将有两行,如下所示:

-------------------------
| first_name | COUNT(*) |
-------------------------
| Foo        | 3        |
| Bar        | 3        |
-------------------------
  

从员工中选择first_name,(从员工中选择count(*));

在此示例中,在SELECT语句中使用第二个查询与使用常量没有区别。请考虑以下查询:

  

从员工中选择first_name,5;

您的结果将有两列。第二列将始终包含5.当您在SELECT语句中执行第二个查询时,该查询的结果将以完全相同的方式使用。

我希望这至少让它更清晰一点。

答案 2 :(得分:-1)

没有。这是对的。它很重要。使用group-by计算名称的不同。

Select first_name,  count(*) from employee
Group by first_name 

或使用不同的正确计数

Select first_name,  count(distinct first_name) from employee 

这个计算给定列名的不同值。