簡體   English   中英

MySQL計數(*)沒有分組依據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM