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文档:4.3.4.8计数行.
如果未启用ONLY_FULL_GROUP_BY,则通过将所有行视为单个组来处理查询,但为每个命名列选择的值是不确定的.服务器可以自由选择任何行中的值:
Run Code Online (Sandbox Code Playgroud)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没有设定.