2016-02-21 26 views
1

使用员工数据库(https://github.com/datacharmer/test_db)我(作为一个例子)以下语句:为什么COUNT(*)限制我的搜索,以1行

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行(仅格奥尔基被显示出来),而最后一条语句(与子查询)显示所有的名字,因此没有按不像第一个那样限制我的搜索查询。

+2

你的问题是什么? – BenM

+0

@BenM我不明白为什么第一条语句将我的搜索查询限制为1行(只有Georgi显示),而最后一条语句(带有子查询)显示所有名称,因此不会将我的搜索查询限制为1排像第一个一样。 – moon

+3

'从雇员中选择first_name,count(*);'实际上是一个指定不足的查询,MySQL解释类似'select a_random(first_name),count(*)from employees;'大多数其他RDBMS对这种查询。 –

回答

3

第一个查询:

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

你的第二个查询:

你正在做同样的事情(指第一次查询),但现在你在subquery做所以它运行的每一行,它再次Count(*)所以返回相同的价值。

解决方案:

您需要使用Group By通过first_name,使组数据。然后Count每个组中的行:

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

它会给你算在你的数据集中的所有first_name

+0

就是这样,谢谢!如果我的问题不是很清楚,也很抱歉。 – moon

-1

不,这是正确的。它统计所有。使用group-by来计算不同的名称。

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

或者使用具有鲜明

Select first_name, count(distinct first_name) from employee 

这一个适当的计数统计上给出的列名不同的值。

2

COUNTGROUP BY子句结合使用的方式在第一次遇到它时会有点混淆。我会试着解释它在你提供的每个例子中的表现。

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

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

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

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

让我们假设你的表总共包含6行,从其中三个有FIRST_NAME字段等于和其他三酒吧。您最终将拥有两个组,并且COUNT函数将计算每个组中的行数。因此,其结果将有两行,看起来像这样:

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

SELECT名字,(SELECT COUNT(*)FROM雇员)从员工;

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

从雇员选择first_name,5;

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

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

相关问题