MySql计数(*)没有group by

时间:2015-07-07 00:28:44

标签: mysql

我有下表pet

+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1989-03-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
| Jenny    | Robert | dog     | f    | 2004-01-01 | 2014-05-04 |
+----------+--------+---------+------+------------+------------+

我决定运行没有GROUP BY子句的查询,如下所示:

SELECT owner, COUNT(*) FROM pet;

得到以下信息:

+--------+----------+
| owner  | count(*) |
+--------+----------+
| Harold |       10 |
+--------+----------+

我会认为Robert会在owner列中,因为按字母顺序它是最后一列。知道为什么我得到这个输出吗?

3 个答案:

答案 0 :(得分:3)

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。 服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加{{1}不会影响每个组中值的选择。子句。选择值后会对结果集进行排序,ORDER BY不会影响服务器选择的每个组中的值。 MySQL Manual

答案 1 :(得分:1)

它不应该得到最后一个,它获得第一个所有者,然后继续COUNT(*)获取所有行,这就是所有查询。

答案 2 :(得分:0)

为什么不尝试:

SELECT MIN(owner), count(*) from pet;

这将检索"较小的"所有者(在这种情况下,第一个按字母顺序排序)。