MySQL解惑——GROUP BY隱式排序

来源:https://www.cnblogs.com/kerrycode/archive/2019/11/11/11836647.html
-Advertisement-
Play Games

MySQL中GROUP BY隱式排序是什麼概念呢? 主要是其它RDBMS沒有這樣的概念,如果沒有認真瞭解過概念,對這個概念會感覺有點困惑,我們先來看看官方文檔的介紹: 官方文檔MySQL 5.7 Reference Manual中的“.2.1.14 ORDER BY Optimization”章節有... ...


MySQL中GROUP BY隱式排序是什麼概念呢? 主要是其它RDBMS沒有這樣的概念,如果沒有認真瞭解過概念,對這個概念會感覺有點困惑,我們先來看看官方文檔的介紹:

 

官方文檔MySQL 5.7 Reference Manual中的.2.1.14 ORDER BY Optimization章節有如下介紹:

 

GROUP BY implicitly sorts by default (that is, in the absence of ASC or DESC designators for GROUP BY columns). However, relying on implicit GROUP BY sorting (that is, sorting in the absence of ASC or DESC designators) or explicit sorting for GROUP BY (that is, by using explicit ASC or DESC designators for GROUP BY columns) is deprecated. To produce a given sort order, provide an ORDER BY clause.

 

預設情況下GROUP BY隱式排序(即,缺少GROUP BY列的ASC或DESC指示符)。但是,不推薦依賴於隱式GROUP BY排序(即,在沒有ASC或DESC指示符的情況下排序)或GROUP BY的顯式排序(即,通過對GROUP BY列使用顯式ASC或DESC指示符)。要生成給定的排序 ORDER,請提供ORDER BY子句。

 

從MySQL 8.0開始,GROUP BY欄位不再支持隱式排序. 官方文檔MySQL 8.0 Reference Manual中8.2.1.16 ORDER BY Optimization章節有如下介紹:

 

Previously (MySQL 5.7 and lower), GROUP BY sorted implicitly under certain conditions. In MySQL 8.0, that no longer occurs, so specifying ORDER BY NULL at the end to suppress implicit sorting (as was done previously) is no longer necessary. However, query results may differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

 

那麼來看看MySQL的GROUP BY隱式排序(GROUP BY sorted implicitly)吧。我們用Removal of implicit and explicit sorting for GROUP BY這篇博客中的例子。

 

下麵實驗環境為MySQL 5.6.41()

 

mysql> select version() from dual;
+------------+
| version()  |
+------------+
| 5.6.41-log |
+------------+
1 row in set (0.00 sec)
 
mysql> CREATE TABLE t (id INTEGER,  cnt INTEGER);
Query OK, 0 rows affected (0.04 sec)
 
mysql> INSERT INTO t VALUES (4,1),(3,2),(1,4),(2,2),(1,1),(1,5),(2,6),(2,1),(1,3),(3,4),(4,5),(3,6);
Query OK, 12 rows affected (0.00 sec)
Records: 12  Duplicates: 0  Warnings: 0

 

#MySQL在這裡隱式地對GROUP BY的結果進行排序(即在缺少GROUP BY列的ASC或DESC指示符的情況下)。

mysql> SELECT id, SUM(cnt) FROM t GROUP BY id; --GROUP BY隱式排序
+------+----------+
| id   | SUM(cnt) |
+------+----------+
|    1 |       13 |
|    2 |        9 |
|    3 |       12 |
|    4 |        6 |
+------+----------+
4 rows in set (0.00 sec)

 

 

MySQL還支持使用GROUP BY進行顯式排序(即通過對GROUP BY列使用顯式ASC或DESC指示符)

 

mysql> SELECT id, SUM(cnt) FROM t GROUP BY id DESC;  --GROUP BY顯式排序
+------+----------+
| id   | SUM(cnt) |
+------+----------+
|    4 |        6 |
|    3 |       12 |
|    2 |        9 |
|    1 |       13 |
+------+----------+
4 rows in set (0.00 sec)

 

從MySQL8.0開始,MySQL不再支持GROUP BY的隱式或顯示排序,如下所示:

 

 

#下麵實驗環境為MySQL 8.0.18

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.18    |
+-----------+
1 row in set (0.00 sec)
 
mysql> CREATE TABLE t (id INTEGER,  cnt INTEGER);
Query OK, 0 rows affected (0.39 sec)
 
mysql> INSERT INTO t VALUES (4,1),(3,2),(1,4),(2,2),(1,1),(1,5),(2,6),(2,1),(1,3),(3,4),(4,5),(3,6);
Query OK, 12 rows affected (0.10 sec)
Records: 12  Duplicates: 0  Warnings: 0
 
mysql> SELECT id, SUM(cnt) FROM t GROUP BY id;
+------+----------+
| id   | SUM(cnt) |
+------+----------+
|    4 |        6 |
|    3 |       12 |
|    1 |       13 |
|    2 |        9 |
+------+----------+
4 rows in set (0.00 sec)
 
mysql> SELECT id, SUM(cnt) FROM t GROUP BY id DESC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC' at line 1

 

clip_image001

 

如上所示,GROUP BY隱式排序不支持了,在MySQL 8.0中,上面測試例子是無序的。GROUP BY顯示排序則直接報錯。所以如果有資料庫從MySQL 5.7或之前的版本,遷移升級到MySQL 8的話,就需要特別留意這個問題了。正確的做法應該是GROUP BY .. ORDER BY 這種操作。如下所示:

 

mysql>  SELECT id, SUM(cnt) FROM t GROUP BY id
    ->  ORDER BY id;
+------+----------+
| id   | SUM(cnt) |
+------+----------+
|    1 |       13 |
|    2 |        9 |
|    3 |       12 |
|    4 |        6 |
+------+----------+
4 rows in set (0.00 sec)
 
mysql> 

 

 

MySQL 8.0.13中刪除了GROUP BY的顯式排序。至於為什麼MySQL 8.0不再支持GROUP BY的隱式排序和顯示排序,這篇文章

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境:centos7 mysql8.0.18 一、下載mysql服務軟體包 地址:https://dev.mysql.com/downloads/mysql/ rpm package:是某個特定的包,比如server,client,devle等 rpm bundle:是該版本所有包的集合 Compr ...
  • 原文轉自 jerryhe326:https://www.cnblogs.com/jerrypro/p/7062101.html 一、安裝準備 首先由於nginx的一些模塊依賴一些lib庫,所以在安裝nginx之前,必須先安裝這些lib庫,這些依賴庫主要有g++、gcc、openssl-devel、p ...
  • 1.什麼是rpm包 是一種編譯好的二進位軟體包,安裝速度快。 2.rpm包命名 el6:軟體包用於在Red Hat 6.x, CentOS 6.x, and CloudLinux 6.x進行安裝 el7:軟體包用於在Red Hat 7.x, CentOS 7.x, and CloudLinux 7. ...
  • 1. 安裝virtualbox後安裝centos7, 這裡就不在贅述了, 網上有很多教程 2. 先關閉虛擬機, 按照如下設置配置網路 這裡需要使用雙網卡, 我們在開啟第二個網卡, 如下所示 3. 之後開啟虛擬機, 進行如下操作 進入網卡所在目錄 cd /etc/sysconfig/network s ...
  • Linux下壓縮工具gzip和歸檔工具tar及其實戰shell應用 第一章:gzip的使用技巧 gzip [option]... file... -d: 解壓縮,相當於gunzip; -#: 指定壓縮比,預設是6,數字越大壓縮比越大( 1-9); -c: 將壓縮結果輸出至標準輸出; gzip -c ...
  • [20191108]內核參數tcp_keepalive與sqlnet.ora expire_time的一些總結.txt--//前幾天在做12c DCD SQLNET.EXPIRE_TIME相關測試時,在11g資料庫遇到1個古怪的問題,就是設置sqlnet.expire_time無效.不知道為--// ...
  • http://www2.cs.uregina.ca/~bernatja/crowsfoot.html Crow’s Foot Notation A number of data modeling techniques are being used today. One of the most com ...
  • 這一篇接著記錄一下查詢相關的操作。想象一下,如果想要在一張表格中展示某些車輛的耗損和營收情況,我們該怎麼處理。車輛、耗損、營收各自存儲在一張表中,耗損和營收中冗餘了車輛信息……我們便想到了關聯查詢。mongodb 3.2+中開始支持關聯查詢,下麵介紹一下寫關聯查詢的過程。 測試一、 結合前面筆記的成 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...