簡體   English   中英

為什么使用GROUP BY的SQL查詢會產生更多行?

[英]Why does SQL query with GROUP BY produce more rows?

我有下表:

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+

當我運行以下查詢時:

SELECT id, MAX(rev) maxrev, content
FROM YourTable
GROUP BY id;

我明白了:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
| 2    |    1     | ...                                  |
+------+----------+--------------------------------------+

但是如果我刪除GROUP BY子句如下:

SELECT id, MAX(rev) maxrev, content
FROM YourTable;

我明白了:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
+------+----------+--------------------------------------+

這對我來說是違反直覺的,因為期望GROUP BY會通過消除重復值來減少結果數量。 但是,在上述情況下,GROUP BY的引入恰恰相反。 這是因為MAX()函數,如果是這樣,怎么樣?

PS:該表基於此處的SO問題: SQL僅選擇列上具有最大值的行 我試圖理解這個問題的答案 ,並在此過程中遇到了上述情況。

編輯:

我在sqlfiddle.com上使用MySQL 5.6引擎獲得了上述結果,沒有自定義/配置。

它正在使用您的MAX()函數,它取決於您的GROUP BY子句。 因此,對於您的第一個查詢,您說:給我每個id的最大轉速,而第二個只是說給我一般的最大轉速。

感謝xQbert:

並不意味着你在后一種情況下,最大轉速獲得的 它將從選擇中的任何位置獲取值以用於您的id和內容字段。

您可以在此處閱讀有關SQL如何處理GROUP BY語句的更多信息: 文檔

這是因為你使用的是mysql 5.7版本的先前版本..這些版本允許使用聚合的d函數和選擇不在組中的列...這為不聚合的列產生了不可預測的結果..在mysql 5.7中這個beahvior不是允許...如果您選擇未在group by中提及的聚合函數,則會出現錯誤

正確的sintax是第一個顯而易見的

SELECT id, MAX(rev) maxrev, content
FROM YourTable
GROUP BY id;
SELECT id, MAX(rev) maxrev, content FROM YourTable
GROUP BY id;

當你運行它時,因為表中有2個不同的id,你會在結果中得到兩行,每個id帶有一個最大值。 分組發生在id列上。

SELECT id, MAX(rev) maxrev, content
FROM YourTable;

如果刪除group by子句,則結果中只有一行對應於整個表中的最大值。 id沒有分組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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