使用员工数据库(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行。
答案 0 :(得分:3)
您的第一个查询:
Count()
是一个聚合函数,它计算数据集(或组)中的所有行。这就是为什么你只得到一行,因为你在这里只有一个。
您的第二个查询:
你正在做同样的事情(参考第一个查询),但现在你在subquery
中进行了这样的操作,因此它会针对每一行运行,并再次Count(*)
所以它返回相同的价值。
<强>解决方案:强>
您需要使用Group By
按first_name
在数据中创建论坛。然后Count
每组中的行:
Select first_name, count(first_name)
From employee
Group by first_name
它会为您计算数据集中的所有first_name
。
答案 1 :(得分:2)
COUNT
与GROUP BY
子句结合使用的方式在第一次遇到它时会有点混乱。我将尝试解释它在您提供的每个示例中的行为。
从员工中选择first_name,count(*);
COUNT
是aggregate 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
这个计算给定列名的不同值。