[英]MySql count(*) without group by
我有以下餐桌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
列,因為按字母順序是最后一個。 知道我為什么得到這個輸出嗎?
MySQL擴展了
GROUP BY
的使用,以便選擇列表可以引用未在GROUP BY
子句中命名的非聚合列。 這意味着前面的查詢在MySQL中是合法的。 您可以使用此功能來避免不必要的列排序和分組,從而獲得更好的性能。 但是,這主要在每個未聚合列中未在GROUP BY中命名的所有值對於每個組都相同時才有用。 服務器可以從每個組中自由選擇任何值,因此,除非它們相同,否則選擇的值是不確定的。 此外,通過添加ORDER BY
子句不會影響從每個組中選擇值。 選擇值之后,將對結果集進行排序,並且ORDER BY
不會影響服務器在每個組中選擇哪個值。 MySQL手冊
它不應該獲得最后一個,它要獲得第一個所有者,然后繼續執行COUNT(*)來獲取所有行,這就是所有查詢所要做的。
您為什么不嘗試:
SELECT MIN(owner), count(*) from pet;
這將檢索“較小”的所有者(在這種情況下,第一個所有者按字母順序排列)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.