我有下表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 |
+--------+-------------+---------+------+------------+------------+
现在如果我运行以下查询:
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()
and count()
函数使得MySQL
输出第二个owner
Diane在第一个例子中?
COUNT()
是一个聚合函数,通常与GROUP BY
clause.
curdate()
是一个输出当前日期的日期函数。
只有 MySQL(据我所知)允许这种语法而不使用GROUP BY
条款。既然你没有提供,COUNT(*)
将计算表中的总行数,并且owner
列将被随机选择/优化器默认/按索引。
这应该是您的查询:
select owner, count(*)
from pet
group by owner;
这告诉优化器计算总行数,例如each owner.
当没有提到 group by 子句时 - 聚合函数将应用于表的整个数据。
EDIT:通常无法完成将应用于每一行的计数COUNT()
通常与分析函数一起使用 ->COUNT() OVER(PARTITION...)
不幸的是 MySQL 中不存在。你的另一个选择是做一个JOIN/CORRELATED QUERY
对于这个附加列。
另一个编辑:如果您想计算每个所有者旁边的总数,可以使用子查询:
SELECT owner,
(SELECT COUNT(*) FROM pet) as cnt
FROM pet
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)