为什么 COUNT() 只显示一行 table?
Why does COUNT() show only one row of table?
我在数据库 menagerie
中有以下 table pet
:
+--------+-------------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------------+---------+------+------------+------------+
| Tommy | Salman Khan | Lebre | NULL | 1999-01-13 | 0000-00-00 |
| Bowser | Diane | dog | m | 1981-08-31 | 1995-07-29 |
+--------+-------------+---------+------+------------+------------+
现在如果我运行下面的查询:
select owner, curdate() from pet;
我得到以下输出:
+-------------+------------+
| owner | curdate() |
+-------------+------------+
| Salman Khan | 2016-09-12 |
| Diane | 2016-09-12 |
+-------------+------------+
输出显示 owner
的所有值,每行显示从 curdate()
返回的值。
现在,如果我 运行 以下查询:
select owner, count(*) from pet;
我得到以下输出:
+-------------+----------+
| owner | count(*) |
+-------------+----------+
| Salman Khan | 2 |
+-------------+----------+
我的问题是 curdate()
和 count()
函数之间的区别是什么使得 MySQL
输出第二个 owner
Diane在第一个例子中?
COUNT()
是一个聚合函数,通常与 GROUP BY
子句结合使用。
curdate()
是一个输出当前日期的日期函数。
只有 MySQL(据我所知)允许这种语法而不使用 GROUP BY
子句。由于您没有提供,COUNT(*)
将计算 table 中的总行数,并且将选择 randomly/optimizer default/by 索引中的 owner
列.
这应该是您的查询:
select owner, count(*)
from pet
group by owner;
这告诉优化器计算总行数,每个所有者。
当未提及 group by 子句时 - 聚合函数应用于 table 的整个数据。
编辑: 将应用于每一行的计数通常不能用 COUNT()
完成,通常与分析函数一起使用 -> COUNT() OVER(PARTITION...)
不幸的是 MySQL 中不存在。您的另一个选择是为这个附加列制作一个 JOIN/CORRELATED QUERY
。
另一个编辑:如果你想计算每个所有者旁边的总计数,你可以使用子查询:
SELECT owner,
(SELECT COUNT(*) FROM pet) as cnt
FROM pet
大多数 DBMS 系统不允许像 count() 这样的聚合函数带有没有分组依据的附加列;因为某种原因。 DBMS 不知道要对哪些列进行分组 :-).
解决方案是按所有者列对查询进行分组,如下所示:
SELECT owner, count(*) FROM pet GROUP BY owner;
这与本页底部的场景完全一样:MySQL Documentation: 4.3.4.8 Counting Rows。
If ONLY_FULL_GROUP_BY is not enabled, the query is processed by
treating all rows as a single group, but the value selected for each
named column is indeterminate. The server is free to select the value
from any row:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT owner, COUNT(*) FROM pet;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Harold | 8 |
+--------+----------+
1 row in set (0.00 sec)
我想在这种情况下 only_full_group_by
没有设置。
Count(*)聚合函数它returns只有一个值,即总行数。 curdate()函数只是提供系统的当前日期。
最后一个查询对 Oracle 无效:ORA-00937:不是单组函数。这意味着您需要一个 GROUP BY 子句。您在 MySql 实现中发现了一个漏洞。不要在生产系统中依赖这样的查询,在 MySql 的下一个版本中这可能不起作用。
我在数据库 menagerie
中有以下 table pet
:
+--------+-------------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------------+---------+------+------------+------------+
| Tommy | Salman Khan | Lebre | NULL | 1999-01-13 | 0000-00-00 |
| Bowser | Diane | dog | m | 1981-08-31 | 1995-07-29 |
+--------+-------------+---------+------+------------+------------+
现在如果我运行下面的查询:
select owner, curdate() from pet;
我得到以下输出:
+-------------+------------+
| owner | curdate() |
+-------------+------------+
| Salman Khan | 2016-09-12 |
| Diane | 2016-09-12 |
+-------------+------------+
输出显示 owner
的所有值,每行显示从 curdate()
返回的值。
现在,如果我 运行 以下查询:
select owner, count(*) from pet;
我得到以下输出:
+-------------+----------+
| owner | count(*) |
+-------------+----------+
| Salman Khan | 2 |
+-------------+----------+
我的问题是 curdate()
和 count()
函数之间的区别是什么使得 MySQL
输出第二个 owner
Diane在第一个例子中?
COUNT()
是一个聚合函数,通常与 GROUP BY
子句结合使用。
curdate()
是一个输出当前日期的日期函数。
只有 MySQL(据我所知)允许这种语法而不使用 GROUP BY
子句。由于您没有提供,COUNT(*)
将计算 table 中的总行数,并且将选择 randomly/optimizer default/by 索引中的 owner
列.
这应该是您的查询:
select owner, count(*)
from pet
group by owner;
这告诉优化器计算总行数,每个所有者。
当未提及 group by 子句时 - 聚合函数应用于 table 的整个数据。
编辑: 将应用于每一行的计数通常不能用 COUNT()
完成,通常与分析函数一起使用 -> COUNT() OVER(PARTITION...)
不幸的是 MySQL 中不存在。您的另一个选择是为这个附加列制作一个 JOIN/CORRELATED QUERY
。
另一个编辑:如果你想计算每个所有者旁边的总计数,你可以使用子查询:
SELECT owner,
(SELECT COUNT(*) FROM pet) as cnt
FROM pet
大多数 DBMS 系统不允许像 count() 这样的聚合函数带有没有分组依据的附加列;因为某种原因。 DBMS 不知道要对哪些列进行分组 :-).
解决方案是按所有者列对查询进行分组,如下所示:
SELECT owner, count(*) FROM pet GROUP BY owner;
这与本页底部的场景完全一样:MySQL Documentation: 4.3.4.8 Counting Rows。
If ONLY_FULL_GROUP_BY is not enabled, the query is processed by treating all rows as a single group, but the value selected for each named column is indeterminate. The server is free to select the value from any row:
mysql> SET sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> SELECT owner, COUNT(*) FROM pet; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Harold | 8 | +--------+----------+ 1 row in set (0.00 sec)
我想在这种情况下 only_full_group_by
没有设置。
Count(*)聚合函数它returns只有一个值,即总行数。 curdate()函数只是提供系统的当前日期。
最后一个查询对 Oracle 无效:ORA-00937:不是单组函数。这意味着您需要一个 GROUP BY 子句。您在 MySql 实现中发现了一个漏洞。不要在生产系统中依赖这样的查询,在 MySql 的下一个版本中这可能不起作用。