为什么 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 的下一个版本中这可能不起作用。