为什么COUNT()只显示一行表?

use*_*782 22 mysql sql database count mysql-5.7

pet在数据库中有以下表格menagerie:

+--------+-------------+---------+------+------------+------------+
| 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 |
+--------+-------------+---------+------+------------+------------+
Run Code Online (Sandbox Code Playgroud)

现在如果我运行以下查询:

select owner, curdate() from pet;  
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

+-------------+------------+
| owner       | curdate()  |
+-------------+------------+
| Salman Khan | 2016-09-12 |
| Diane       | 2016-09-12 |
+-------------+------------+
Run Code Online (Sandbox Code Playgroud)

输出显示每行的所有值owner和返回的值curdate().

现在,如果我运行以下查询:

select owner, count(*) from pet;  
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

+-------------+----------+
| owner       | count(*) |
+-------------+----------+
| Salman Khan |        2 |
+-------------+----------+  
Run Code Online (Sandbox Code Playgroud)

我的问题是什么之间的区别curdate(),并count()使得功能MySQL输出第二owner 黛安在第一个例子吗?

sag*_*agi 56

COUNT()是一个聚合函数,通常与一个GROUP BY子句结合使用.

curdate() 是一个输出当前日期的日期函数.

只有MySQL(据我所知)允许这种语法而不使用该GROUP BY子句.由于您没有提供它,COUNT(*)将计算表中的总行数,并且owner将随机选择列/优化程序默认/通过索引.

这应该是您的查询:

select owner, count(*) 
from pet
group by owner;
Run Code Online (Sandbox Code Playgroud)

这告诉优化器为每个所有者计算总行数.

如果没有提到group by子句 - 聚合函数将应用于表的整个数据.

编辑:将在每行上应用的计数通常无法使用COUNT()并且通常与分析函数一起使用 - > COUNT() OVER(PARTITION...)遗憾的是,在MySQL中不存在.您的另一个选择是JOIN/CORRELATED QUERY为此附加列添加一个.

另一个编辑:如果要在每个所有者旁边计算总数,可以使用子查询:

SELECT owner,
       (SELECT COUNT(*) FROM pet) as cnt
FROM pet
Run Code Online (Sandbox Code Playgroud)

  • 是的,只有MySQL,据我所知,有这个"该死的鱼雷,我不在乎你所要求的是胡说八道,如果可能的话,我会疯狂猜测并返回一个结果集而不是给用户一个警告"态度. (24认同)
  • @ user31782当您使用没有group by的聚合函数时 - 输出将**总是**为1行. (9认同)

P.S*_*mon 8

这看起来与本页底部的场景完全相同:MySQL文档:4.3.4.8计数行.

如果未启用ONLY_FULL_GROUP_BY,则通过将所有行视为单个组来处理查询,但为每个命名列选择的值是不确定的.服务器可以自由选择任何行中的值:

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)
Run Code Online (Sandbox Code Playgroud)

我想在这种情况下only_full_group_by没有设定.