mysql中group by
阿新 • • 發佈:2019-02-15
對於group by在mysql中的使用和Oracle的差異性很大,準確的說不光和Oracle和別的資料庫差異性一樣,這些有點不太遵循標準SQL。我們知道常規的
sql,對於group by來說一定要結合聚合函式,而且選擇的欄位除了聚合函式外,還必須在group by中出現,否則報錯,但是在mysql中擴充套件了這樣的功能
首先對於不加聚合函式的sql來說,它的功能結合了limit來得出結果,仔細想想的時候有點Oracle分析函式的味道,limit的時候得到的並不是 最大最小的值,而是某一下group by結果集中第一行,也就是剛才說的相當與先group by, 然後在每個group by下面進行limit 1。
其次,剛才還說了常規的group by結合聚合函式的時候,選擇的欄位除了聚合函式外,必須在group by中存在,但是在mysql中不是這樣了,它具有隱含欄位的功能,例如:
(root:im-mysql:16:34:45)[test]> select a,b,c,count(*) from test1 group by a,b;
+------+------+------+----------+
| a
| b | c | count(*) |
+------+------+------+----------+
| 1 | 1 | 1 | 3 |
| 1 | 2 | 5 | 3 |
+------+------+------+----------+
對於沒有選擇的欄位,上面是c,c的值還是和上面說到的一樣,是根據得到的結果集然後根據每個group by 進行limit 1得到的結果。
首先對於不加聚合函式的sql來說,它的功能結合了limit來得出結果,仔細想想的時候有點Oracle分析函式的味道,limit的時候得到的並不是 最大最小的值,而是某一下group by結果集中第一行,也就是剛才說的相當與先group by, 然後在每個group by下面進行limit 1。
其次,剛才還說了常規的group by結合聚合函式的時候,選擇的欄位除了聚合函式外,必須在group by中存在,但是在mysql中不是這樣了,它具有隱含欄位的功能,例如:
(root:im-mysql:16:34:45)[test]> select a,b,c,count(*) from test1 group by a,b;
+------+------+------+----------+
| a
| b | c | count(*) |
+------+------+------+----------+
| 1 | 1 | 1 | 3 |
| 1 | 2 | 5 | 3 |
+------+------+------+----------+
對於沒有選擇的欄位,上面是c,c的值還是和上面說到的一樣,是根據得到的結果集然後根據每個group by 進行limit 1得到的結果。